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. [leetcode]143. Reorder List重排链表

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You may not mod ...

  2. 9-centos定时任务-不起作用- 没指明路径!!!

    crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,cro ...

  3. 【转】Https内部机制基础知识

    互联网权威机构 - CA 机构,又称为证书授权 (Certificate Authority) 机构,浏览器会内置这些"受信任的根证书颁发机构" (即 CA). 数字证书 提及 H ...

  4. linux安装json

    安装Json库 1.下载JsonCpphttp://sourceforge.net/projects/jsoncpp/files/ 2.下载sconshttp://sourceforge.net/pr ...

  5. Java NIO系列教程(四) Scatter 和 Gather

    Java NIO系列教程(四) Scatter 和 Gather Java NIO 开始支持 scatter/gather,scatter/gather 用于描述从 Channel(译者注:Chann ...

  6. c#递归实现螺旋数组

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  7. c++11 改进设计模式 Singleton模式

    关于学习 <深入应用c++11>的代码笔记: c++11之前是这么实现的 template<typename T> class Singleton{ public: stati ...

  8. 数据库链接 mybatis spring data jpa 两种方式

    jdbc mybatis                     spring data jpa dao service webservice jaxrs     jaxws  springmvc w ...

  9. 学习bn算法

    好处: 1.归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低: 2.另外一方面,一旦每批训练数据的分布各不相同(b ...

  10. 记录如何用abd,用电脑输出手机操作信号

    0.http://www.wmzhe.com/soft-39913.html 去这里下载最新版的adb.旧版本很多不好使.一定最新的. 1.用豌豆荚装好驱动 2.开启usb调试.具体方法可以百度到 3 ...