c# 合并重叠时间段的算法
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# 合并重叠时间段的算法的更多相关文章
- leetcode 合并重叠区间变异 合并多个时间段 取并集
public class Solution { public static ArrayList<Interval> merge(ArrayList<Interval> inte ...
- LabelRank非重叠社区发现算法介绍及代码实现(A Stabilized Label Propagation Algorithm for Community Detection in Networks)
最近在研究基于标签传播的社区分类,LabelRank算法基于标签传播和马尔科夫随机游走思路上改装的算法,引用率较高,打算将代码实现,便于加深理解. 这个算法和Label Propagation 算法不 ...
- python 合并重叠数据
- 【LeetCode-面试算法经典-Java实现】【056-Merge Intervals(区间合并)】
[056-Merge Intervals(区间合并)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a collection of intervals, ...
- BZOJ-3229 石子合并 GarsiaWachs算法
经典DP?稳T 3229: [Sdoi2008]石子合并 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 426 Solved: 202 [Submit] ...
- C语言归并排序(合并排序)算法及代码
归并排序也称合并排序,其算法思想是将待排序序列分为两部分,依次对分得的两个部分再次使用归并排序,之后再对其进行合并.仅从算法思想上了解归并排序会觉得很抽象,接下来就以对序列A[0], A[l]…, A ...
- Linux伙伴算法
Linux内存管理伙伴算法 伙伴算法 Linux内核内存管理的任务包括: 遵从CPU的MMU(Memory Management Unit)机制 合理.有效.快速地管理内存 实现内存保护机制 实现虚拟 ...
- 利用Python进行数据分析-Pandas(第五部分-数据规整:聚合、合并和重塑)
在许多应用中,数据可能分散在许多文件或数据库中,存储的形式也不利于分析.本部分关注可以聚合.合并.重塑数据的方法. 1.层次化索引 层次化索引(hierarchical indexing)是panda ...
- 利用Python进行数据分析 第8章 数据规整:聚合、合并和重塑.md
学习时间:2019/11/03 周日晚上23点半开始,计划1110学完 学习目标:Page218-249,共32页:目标6天学完(按每页20min.每天1小时/每天3页,需10天) 实际反馈:实际XX ...
随机推荐
- collections之deque【双向队列】与Queue【单向队列】
今天来向大家介绍两个队列,一个是deque,双向队列,另外一个是Queue,单向队列,队列和堆栈不同,队列为先进先出,大家还需要注意一下,双向队列为collections模块中的类,而Queue为qu ...
- [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 ...
- Python3自动化运维
一.系统基础信息模块详解 点击链接查看:https://www.cnblogs.com/hwlong/p/9084576.html 二.业务服务监控详解 点击链接查看:https://www.cnbl ...
- linux 下 php 安装 libevent
一.安装libevent库 1.到libevent官网下载安装源码 http://libevent.org/ 如:libevent-2.0.22-stable.tar.gz 2.解压源码包 > ...
- css设置超出部分文档隐藏(在table标签中不好使解决方案在下)
css设置: .text-over{overflow: hidden;white-space: nowrap;text-overflow: ellipsis;cursor: pointer} div设 ...
- 超星网站cc++
a系统 苏龙杰 a系统 苏龙杰 目录 1 C/C ++程序设计 1.1 前 言 1.2 第一部分 基 础 篇 1.2.1 第1章 初识C 1.2.1.1 1.1 C语言的诞生与发展 1 ...
- 全基因组测序 从头测序(de novo sequencing) 重测序(re-sequencing)
全基因组测序 全基因组测序分为从头测序(de novo sequencing)和重测序(re-sequencing). 从头测序(de novo)不需要任何参考基因组信息即可对某个物种的基因组进行测序 ...
- 47 On Interpersonal Relationship 关于人际关系
47 On Interpersonal Relationship 关于人际关系 ①Since we are social beings, the quality of our lives depend ...
- svn 创建tag
1. 右键项目(源) 2. 选择复制到哪个路径(创建文件夹选项) 3. 选择哪个版本(源的) 4. 填写备注 5. 结束 使用:import .合并等
- 推荐:普通UI设计师与顶级UI设计师的区别是什么?(转)
我不是顶级设计师(我甚至不知道什么才叫顶级),即使见过的一些顶级(知名or优秀)设计师也因为交流不深入,无法评价.但是我勉强可以回答优秀的设计师,和普通的设计师(其实我觉得大部分的普通设计师只是认识他 ...