c# 合并重叠时间段的算法

一.采用非排序:

方案一:

使用递归算法,如不喜欢递归的伙伴们,可以使用whie代替。

1.文件:Extract_Chao.cs(核心)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Extract
{
public class Extract_Chao
{
List<ExtractInfo> extractList = new List<ExtractInfo>();
public void Main()
{
var list = AddExtract();
BuidExtract(list, ); for (int i = ; i < extractList.Count; i++)
{
if (extractList[i] == null) continue;
Console.WriteLine(extractList[i].StartPoint + "-------" + extractList[i].EndPoint);
}
} private void BuidExtract(List<ExtractInfo> list, int num)
{
for (int i = ; i < list.Count; i++)
{
          if(i==num)continue; if (list[i] != null &&list[num]!=null)
{
if (list[i].StartPoint > list[num].StartPoint && list[i].StartPoint <= list[num].EndPoint)
{
if (list[i].EndPoint > list[num].EndPoint)
{
var extractTemp = new ExtractInfo() { StartPoint = list[num].StartPoint, EndPoint = list[i].EndPoint };
list[num] = extractTemp;
                //如果数组有变化,那么就重新递归回调,(我的死穴)
                 num=;
           BuidExtract(list,num);
}
list[i] = null;
}
}
} num++; if (num < list.Count)
{
BuidExtract(list, num);
}
else
{
extractList = list;
} } private List<ExtractInfo> AddExtract()
{
var list = new List<ExtractInfo>();
list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = }); list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = }); return list;
} }
}

2. 文件:ExtractInfo.cs(实体)

  public class ExtractInfo
{
public double StartPoint { get; set; } public double EndPoint { get; set; }
}

3.文件:Program.cs(入口)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Extract
{
class Program
{
static void Main(string[] args)
{ Extract_Chao chao = new Extract_Chao();
chao.Main(); Console.WriteLine("OK");
Console.Read();
}
}
}

4.运行结果:

方案二:

文件:ExtractPoint_Zhang3.cs(核心代码)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Extract
{
/// <summary>
/// 不排序,递归算法,当集合有变化,回调
/// </summary>
public class ExtractPoint_Zhang3
{
List<ExtractInfo> extractList = new List<ExtractInfo>();
public void Main()
{
extractList = AddExtract();
Console.WriteLine("运算前数据如下:");
for (int i = ; i < extractList.Count; i++)
{
Console.WriteLine(extractList[i].StartPoint + "---" + extractList[i].EndPoint);
} BuidExtract();
Console.WriteLine();
Console.WriteLine("运算后数据如下:");
for (int i = ; i < extractList.Count; i++)
{
if (extractList[i] == null) continue;
Console.WriteLine(extractList[i].StartPoint + "---" + extractList[i].EndPoint);
}
} private void BuidExtract()
{
for (int i = ; i < extractList.Count; i++)
{
if (IsMerge(i))
{
BuidExtract();
}
}
} private bool IsMerge(int num)
{
var isContinue = false; for (int i = ; i < extractList.Count; i++)
{
if (num == i) continue; if (extractList[i].StartPoint > extractList[num].StartPoint && extractList[i].StartPoint <= extractList[num].EndPoint)
{
if (extractList[i].EndPoint > extractList[num].EndPoint)
{
var extractTemp = new ExtractInfo() { StartPoint = extractList[num].StartPoint, EndPoint = extractList[i].EndPoint }; var tempI = extractList[i];
var tempNum = extractList[num];
extractList.Remove(tempI);
extractList.Remove(tempNum);
extractList.Add(extractTemp); }
else
{
var tempI = extractList[i];
extractList.Remove(tempI);
} isContinue = true;
break;
}
}
return isContinue;
} private List<ExtractInfo> AddExtract()
{
var list = new List<ExtractInfo>();
//list.Add(new ExtractInfo() { StartPoint = 5, EndPoint = 10 });
//list.Add(new ExtractInfo() { StartPoint = 20, EndPoint = 30 });
//list.Add(new ExtractInfo() { StartPoint = 6, EndPoint = 25 }); //list.Add(new ExtractInfo() { StartPoint = 24, EndPoint = 41 });
//list.Add(new ExtractInfo() { StartPoint = 58, EndPoint = 75 });
//list.Add(new ExtractInfo() { StartPoint = 62, EndPoint = 80 });
//list.Add(new ExtractInfo() { StartPoint = 79, EndPoint = 89 });
//list.Add(new ExtractInfo() { StartPoint = 89, EndPoint = 100 }); list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
list.Add(new ExtractInfo() { StartPoint = , EndPoint = }); return list;
} }
}

二.采用排序算法:

方案一:

http://www.cnblogs.com/artwl/archive/2011/03/01/1968044.html

地址失效解决方案:

函数:Union(核心代码)

   public void Union()
{
//先对数据排序
extractList = extractList.OrderBy(p => p.StartPoint).ToList<ExtractInfo>();
for (int i = ; i < extractList.Count - ; i++)
{
int j = i + ;
if (extractList[i].EndPoint >= extractList[j].StartPoint)
{
//处理后一条数据的结束时间比前一条数据结束时间小的情况
if (extractList[i].EndPoint >= extractList[j].EndPoint)
{
extractList[j] = extractList[i];
}
else
{
extractList[j].StartPoint = extractList[i].StartPoint;
}
extractList[i] = null;
}
else
{
i++;
}
}
}

此算法甚好的,只是不满足我的需求:(上一个终点等于下一个起点的时候)【根据自己的需求选择方案】

例如如下两段时间段:

5-10

10-20

我的需求结果是要合并:5-20

方案二:

文件:ExtractPoint_Zhang.cs(核心代码)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Extract
{
/// <summary>
/// 排序算法
/// </summary>
public class ExtractPoint_Zhang
{
List<ExtractInfo> extractListNew = new List<ExtractInfo>(); public void Main()
{
var list = AddExtract(); ExtractCombination(list); for (var i = ; i < extractListNew.Count; i++)
{
Console.WriteLine(extractListNew[i].StartPoint + "----" + extractListNew[i].EndPoint);
}
} List<ExtractInfo> AddExtract()
{
var extractListOld = new List<ExtractInfo>();
//extractListOld.Add(new ExtractInfo() { StartPoint = 5, EndPoint = 10 });
//extractListOld.Add(new ExtractInfo() { StartPoint = 20, EndPoint = 30 });
//extractListOld.Add(new ExtractInfo() { StartPoint = 6, EndPoint = 25 }); //extractListOld.Add(new ExtractInfo() { StartPoint = 24, EndPoint = 41 });
//extractListOld.Add(new ExtractInfo() { StartPoint = 58, EndPoint = 75 });
//extractListOld.Add(new ExtractInfo() { StartPoint = 62, EndPoint = 80 });
//extractListOld.Add(new ExtractInfo() { StartPoint = 79, EndPoint = 89 });
//extractListOld.Add(new ExtractInfo() { StartPoint = 89, EndPoint = 100 }); extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = }); return extractListOld;
} void ExtractCombination(List<ExtractInfo> list)
{
var listNew = new List<ExtractInfo>();
list = list.OrderBy(x => x.StartPoint).ToList<ExtractInfo>(); for (int i = ; i < list.Count; )
{
var num = i + ; if (num >= list.Count) break; if (list[num].StartPoint <= list[i].EndPoint)
{
if (list[num].EndPoint > list[i].EndPoint)
{
var extractTemp = new ExtractInfo();
extractTemp.StartPoint = list[i].StartPoint;
extractTemp.EndPoint = list[num].EndPoint; var tempI = list[i];
var tempNum = list[num];
list.Remove(tempI);
list.Remove(tempNum);
list.Add(extractTemp);
}
else
{
var tempI = list[i];
list.Remove(tempI);
}
list = list.OrderBy(x => x.StartPoint).ToList<ExtractInfo>();
i = ;
}
else
{
i++;
}
}
extractListNew = list;
}
}
}

更多方案见百度云盘:

http://pan.baidu.com/s/1nvjmNtn

思路决定程序出路

    ---逻辑与思维

欢迎大家分享更好的算法,独乐不如众乐!                                  

c# 合并重叠时间段的算法的更多相关文章

  1. leetcode 合并重叠区间变异 合并多个时间段 取并集

    public class Solution { public static ArrayList<Interval> merge(ArrayList<Interval> inte ...

  2. LabelRank非重叠社区发现算法介绍及代码实现(A Stabilized Label Propagation Algorithm for Community Detection in Networks)

    最近在研究基于标签传播的社区分类,LabelRank算法基于标签传播和马尔科夫随机游走思路上改装的算法,引用率较高,打算将代码实现,便于加深理解. 这个算法和Label Propagation 算法不 ...

  3. python 合并重叠数据

  4. 【LeetCode-面试算法经典-Java实现】【056-Merge Intervals(区间合并)】

    [056-Merge Intervals(区间合并)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a collection of intervals, ...

  5. BZOJ-3229 石子合并 GarsiaWachs算法

    经典DP?稳T 3229: [Sdoi2008]石子合并 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 426 Solved: 202 [Submit] ...

  6. C语言归并排序(合并排序)算法及代码

    归并排序也称合并排序,其算法思想是将待排序序列分为两部分,依次对分得的两个部分再次使用归并排序,之后再对其进行合并.仅从算法思想上了解归并排序会觉得很抽象,接下来就以对序列A[0], A[l]…, A ...

  7. Linux伙伴算法

    Linux内存管理伙伴算法 伙伴算法 Linux内核内存管理的任务包括: 遵从CPU的MMU(Memory Management Unit)机制 合理.有效.快速地管理内存 实现内存保护机制 实现虚拟 ...

  8. 利用Python进行数据分析-Pandas(第五部分-数据规整:聚合、合并和重塑)

    在许多应用中,数据可能分散在许多文件或数据库中,存储的形式也不利于分析.本部分关注可以聚合.合并.重塑数据的方法. 1.层次化索引 层次化索引(hierarchical indexing)是panda ...

  9. 利用Python进行数据分析 第8章 数据规整:聚合、合并和重塑.md

    学习时间:2019/11/03 周日晚上23点半开始,计划1110学完 学习目标:Page218-249,共32页:目标6天学完(按每页20min.每天1小时/每天3页,需10天) 实际反馈:实际XX ...

随机推荐

  1. 调试Javascript代码(浏览器F12)

    在浏览器中按F12,会弹出一个窗口,这个窗口是给开发人员用于网站调试用的,可以分析网页的问题出现在哪里,同时可以调试多种脚本,是一个开发者工具. 想通过encodeURIComponent将C24\C ...

  2. thrift相关资源

    官网资料,具有各语言的例子 https://thrift.apache.org/tutorial/ https://thrift.apache.org/tutorial/py

  3. 通过命令更新git for windows

    git update-git-for-windows 参考: https://github.com/PanJiaChen/vue-element-admin/issues/24 https://sta ...

  4. 使用JMX监控Storm的nimbus、supervisor、woker

    可以通过在storm.yaml中增加如下样例的配置, 启动JMX来监控storm的各个角色. 其中对于Worker的监控,因为一个节点上可以有多个work,为了防止端口号重复导致启动失败,所以用动态代 ...

  5. classification report 使用

    别人写的,但是还是有些不清晰,我最后补上了 最后一行:第一个0.7=(0.5*1+0*1+1*3)/5  其他类似 support行:在真实数据中y_ture中class 0有一个 class 1有1 ...

  6. hive 报错 java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

    Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable ...

  7. linux 硬盘分区攻略

    以下的sdX代表硬盘分区(如sda1,sda2,sdb1...等等),如果已有的硬盘分区需要改变大小的话,请参考另一篇文章. /boot:开机用的磁盘空间了,至少78MB,一般给100MB就好了. / ...

  8. Silverlight StoryBoard 动态切换ImageSource

    Silverlight StoryBoard 动态切换ImageSource <StackPanel Grid.Row="1" Orientation="Horiz ...

  9. 构建ASP.NET网站十大必备工具

    最近使用ASP.NET为公司构建了一个简单的公共网站(该网站的地址:http://superexpert.com/).在这个过程中,我们使用了数量很多的免费工具,如果把构建ASP.NET网站的必备工具 ...

  10. SQLInjection 靶场配置

    对于渗透,太小型的网站没有太大价值,而大型网站(比如各种电商平台)对于代码审计往往非常严格,新手基本找不到漏洞,而一些比较容易搞掉的站点(政府.gov.各种教育网站.edu或者很多商业中型站点)渗透又 ...