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

一.采用非排序:

方案一:

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

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Extract
  8. {
  9. public class Extract_Chao
  10. {
  11. List<ExtractInfo> extractList = new List<ExtractInfo>();
  12. public void Main()
  13. {
  14. var list = AddExtract();
  15. BuidExtract(list, );
  16.  
  17. for (int i = ; i < extractList.Count; i++)
  18. {
  19. if (extractList[i] == null) continue;
  20. Console.WriteLine(extractList[i].StartPoint + "-------" + extractList[i].EndPoint);
  21. }
  22. }
  23.  
  24. private void BuidExtract(List<ExtractInfo> list, int num)
  25. {
  26. for (int i = ; i < list.Count; i++)
  27. {
  28.           if(i==num)continue;
  29.  
  30. if (list[i] != null &&list[num]!=null)
  31. {
  32. if (list[i].StartPoint > list[num].StartPoint && list[i].StartPoint <= list[num].EndPoint)
  33. {
  34. if (list[i].EndPoint > list[num].EndPoint)
  35. {
  36. var extractTemp = new ExtractInfo() { StartPoint = list[num].StartPoint, EndPoint = list[i].EndPoint };
  37. list[num] = extractTemp;
  38.                 //如果数组有变化,那么就重新递归回调,(我的死穴)
  39.                  num=;
  40.            BuidExtract(list,num);
  41. }
  42. list[i] = null;
  43. }
  44. }
  45. }
  46.  
  47. num++;
  48.  
  49. if (num < list.Count)
  50. {
  51. BuidExtract(list, num);
  52. }
  53. else
  54. {
  55. extractList = list;
  56. }
  57.  
  58. }
  59.  
  60. private List<ExtractInfo> AddExtract()
  61. {
  62. var list = new List<ExtractInfo>();
  63. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  64. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  65. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  66. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  67.  
  68. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  69. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  70. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  71.  
  72. return list;
  73. }
  74.  
  75. }
  76. }

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

  1. public class ExtractInfo
  2. {
  3. public double StartPoint { get; set; }
  4.  
  5. public double EndPoint { get; set; }
  6. }

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Extract
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13.  
  14. Extract_Chao chao = new Extract_Chao();
  15. chao.Main();
  16.  
  17. Console.WriteLine("OK");
  18. Console.Read();
  19. }
  20. }
  21. }

4.运行结果:

方案二:

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Extract
  8. {
  9. /// <summary>
  10. /// 不排序,递归算法,当集合有变化,回调
  11. /// </summary>
  12. public class ExtractPoint_Zhang3
  13. {
  14. List<ExtractInfo> extractList = new List<ExtractInfo>();
  15. public void Main()
  16. {
  17. extractList = AddExtract();
  18. Console.WriteLine("运算前数据如下:");
  19. for (int i = ; i < extractList.Count; i++)
  20. {
  21. Console.WriteLine(extractList[i].StartPoint + "---" + extractList[i].EndPoint);
  22. }
  23.  
  24. BuidExtract();
  25. Console.WriteLine();
  26. Console.WriteLine("运算后数据如下:");
  27. for (int i = ; i < extractList.Count; i++)
  28. {
  29. if (extractList[i] == null) continue;
  30. Console.WriteLine(extractList[i].StartPoint + "---" + extractList[i].EndPoint);
  31. }
  32. }
  33.  
  34. private void BuidExtract()
  35. {
  36. for (int i = ; i < extractList.Count; i++)
  37. {
  38. if (IsMerge(i))
  39. {
  40. BuidExtract();
  41. }
  42. }
  43. }
  44.  
  45. private bool IsMerge(int num)
  46. {
  47. var isContinue = false;
  48.  
  49. for (int i = ; i < extractList.Count; i++)
  50. {
  51. if (num == i) continue;
  52.  
  53. if (extractList[i].StartPoint > extractList[num].StartPoint && extractList[i].StartPoint <= extractList[num].EndPoint)
  54. {
  55. if (extractList[i].EndPoint > extractList[num].EndPoint)
  56. {
  57. var extractTemp = new ExtractInfo() { StartPoint = extractList[num].StartPoint, EndPoint = extractList[i].EndPoint };
  58.  
  59. var tempI = extractList[i];
  60. var tempNum = extractList[num];
  61. extractList.Remove(tempI);
  62. extractList.Remove(tempNum);
  63. extractList.Add(extractTemp);
  64.  
  65. }
  66. else
  67. {
  68. var tempI = extractList[i];
  69. extractList.Remove(tempI);
  70. }
  71.  
  72. isContinue = true;
  73. break;
  74. }
  75. }
  76. return isContinue;
  77. }
  78.  
  79. private List<ExtractInfo> AddExtract()
  80. {
  81. var list = new List<ExtractInfo>();
  82. //list.Add(new ExtractInfo() { StartPoint = 5, EndPoint = 10 });
  83. //list.Add(new ExtractInfo() { StartPoint = 20, EndPoint = 30 });
  84. //list.Add(new ExtractInfo() { StartPoint = 6, EndPoint = 25 });
  85.  
  86. //list.Add(new ExtractInfo() { StartPoint = 24, EndPoint = 41 });
  87. //list.Add(new ExtractInfo() { StartPoint = 58, EndPoint = 75 });
  88. //list.Add(new ExtractInfo() { StartPoint = 62, EndPoint = 80 });
  89. //list.Add(new ExtractInfo() { StartPoint = 79, EndPoint = 89 });
  90. //list.Add(new ExtractInfo() { StartPoint = 89, EndPoint = 100 });
  91.  
  92. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  93. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  94. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  95. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  96. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  97. list.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  98.  
  99. return list;
  100. }
  101.  
  102. }
  103. }

二.采用排序算法:

方案一:

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

地址失效解决方案:

函数:Union(核心代码)

  1. public void Union()
  2. {
  3. //先对数据排序
  4. extractList = extractList.OrderBy(p => p.StartPoint).ToList<ExtractInfo>();
  5. for (int i = ; i < extractList.Count - ; i++)
  6. {
  7. int j = i + ;
  8. if (extractList[i].EndPoint >= extractList[j].StartPoint)
  9. {
  10. //处理后一条数据的结束时间比前一条数据结束时间小的情况
  11. if (extractList[i].EndPoint >= extractList[j].EndPoint)
  12. {
  13. extractList[j] = extractList[i];
  14. }
  15. else
  16. {
  17. extractList[j].StartPoint = extractList[i].StartPoint;
  18. }
  19. extractList[i] = null;
  20. }
  21. else
  22. {
  23. i++;
  24. }
  25. }
  26. }

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

例如如下两段时间段:

5-10

10-20

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

方案二:

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace Extract
  7. {
  8. /// <summary>
  9. /// 排序算法
  10. /// </summary>
  11. public class ExtractPoint_Zhang
  12. {
  13. List<ExtractInfo> extractListNew = new List<ExtractInfo>();
  14.  
  15. public void Main()
  16. {
  17. var list = AddExtract();
  18.  
  19. ExtractCombination(list);
  20.  
  21. for (var i = ; i < extractListNew.Count; i++)
  22. {
  23. Console.WriteLine(extractListNew[i].StartPoint + "----" + extractListNew[i].EndPoint);
  24. }
  25. }
  26.  
  27. List<ExtractInfo> AddExtract()
  28. {
  29. var extractListOld = new List<ExtractInfo>();
  30. //extractListOld.Add(new ExtractInfo() { StartPoint = 5, EndPoint = 10 });
  31. //extractListOld.Add(new ExtractInfo() { StartPoint = 20, EndPoint = 30 });
  32. //extractListOld.Add(new ExtractInfo() { StartPoint = 6, EndPoint = 25 });
  33.  
  34. //extractListOld.Add(new ExtractInfo() { StartPoint = 24, EndPoint = 41 });
  35. //extractListOld.Add(new ExtractInfo() { StartPoint = 58, EndPoint = 75 });
  36. //extractListOld.Add(new ExtractInfo() { StartPoint = 62, EndPoint = 80 });
  37. //extractListOld.Add(new ExtractInfo() { StartPoint = 79, EndPoint = 89 });
  38. //extractListOld.Add(new ExtractInfo() { StartPoint = 89, EndPoint = 100 });
  39.  
  40. extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  41. extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  42. extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  43. extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  44. extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  45. extractListOld.Add(new ExtractInfo() { StartPoint = , EndPoint = });
  46.  
  47. return extractListOld;
  48. }
  49.  
  50. void ExtractCombination(List<ExtractInfo> list)
  51. {
  52. var listNew = new List<ExtractInfo>();
  53. list = list.OrderBy(x => x.StartPoint).ToList<ExtractInfo>();
  54.  
  55. for (int i = ; i < list.Count; )
  56. {
  57. var num = i + ;
  58.  
  59. if (num >= list.Count) break;
  60.  
  61. if (list[num].StartPoint <= list[i].EndPoint)
  62. {
  63. if (list[num].EndPoint > list[i].EndPoint)
  64. {
  65. var extractTemp = new ExtractInfo();
  66. extractTemp.StartPoint = list[i].StartPoint;
  67. extractTemp.EndPoint = list[num].EndPoint;
  68.  
  69. var tempI = list[i];
  70. var tempNum = list[num];
  71. list.Remove(tempI);
  72. list.Remove(tempNum);
  73. list.Add(extractTemp);
  74. }
  75. else
  76. {
  77. var tempI = list[i];
  78. list.Remove(tempI);
  79. }
  80. list = list.OrderBy(x => x.StartPoint).ToList<ExtractInfo>();
  81. i = ;
  82. }
  83. else
  84. {
  85. i++;
  86. }
  87. }
  88. extractListNew = list;
  89. }
  90. }
  91. }

更多方案见百度云盘:

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. collections之deque【双向队列】与Queue【单向队列】

    今天来向大家介绍两个队列,一个是deque,双向队列,另外一个是Queue,单向队列,队列和堆栈不同,队列为先进先出,大家还需要注意一下,双向队列为collections模块中的类,而Queue为qu ...

  2. [leetcode]215. Kth Largest Element in an Array 数组中第k大的元素

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  3. Python3自动化运维

    一.系统基础信息模块详解 点击链接查看:https://www.cnblogs.com/hwlong/p/9084576.html 二.业务服务监控详解 点击链接查看:https://www.cnbl ...

  4. linux 下 php 安装 libevent

    一.安装libevent库 1.到libevent官网下载安装源码 http://libevent.org/ 如:libevent-2.0.22-stable.tar.gz 2.解压源码包 > ...

  5. css设置超出部分文档隐藏(在table标签中不好使解决方案在下)

    css设置: .text-over{overflow: hidden;white-space: nowrap;text-overflow: ellipsis;cursor: pointer} div设 ...

  6. 超星网站cc++

    a系统 苏龙杰     a系统 苏龙杰     目录 1 C/C ++程序设计 1.1 前 言 1.2 第一部分 基 础 篇 1.2.1 第1章 初识C 1.2.1.1 1.1 C语言的诞生与发展 1 ...

  7. 全基因组测序 从头测序(de novo sequencing) 重测序(re-sequencing)

    全基因组测序 全基因组测序分为从头测序(de novo sequencing)和重测序(re-sequencing). 从头测序(de novo)不需要任何参考基因组信息即可对某个物种的基因组进行测序 ...

  8. 47 On Interpersonal Relationship 关于人际关系

    47 On Interpersonal Relationship 关于人际关系 ①Since we are social beings, the quality of our lives depend ...

  9. svn 创建tag

    1. 右键项目(源) 2. 选择复制到哪个路径(创建文件夹选项) 3. 选择哪个版本(源的) 4. 填写备注 5. 结束 使用:import  .合并等

  10. 推荐:普通UI设计师与顶级UI设计师的区别是什么?(转)

    我不是顶级设计师(我甚至不知道什么才叫顶级),即使见过的一些顶级(知名or优秀)设计师也因为交流不深入,无法评价.但是我勉强可以回答优秀的设计师,和普通的设计师(其实我觉得大部分的普通设计师只是认识他 ...