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. Linux readelf命令

    一.简介 readelf用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息.这里的elf-file(s)就表示那些被检查的文件.可以支持32位,64位的elf格式文件, ...

  2. [django] Deploy Django Applications Using uWSGI and Nginx on Ubuntu 14.04

    关键点1:chmod-socket=666 (mysite_uwsgi.ini) 关键点2 : 工程目录和虚拟环境目录搞清楚 几个参考: http://uwsgi-docs.readthedocs.i ...

  3. Mysql 查看表结构的命令

    创建数据库create database abc; 显示数据库 show databases; 使用数据库 use 数据库名; 直接打开数据库 mysql -h localhost -u root - ...

  4. 类方法 isAssignableFrom、instanceof 和 asSubclass

    类方法 isAssignableFrom.instanceof 和 asSubclass Spring 框架 CollectionFactory 的 asEnumType 方法使用 "类.a ...

  5. boost 学习(1)

    智能指针的学习 中文教程网站 http://zh.highscore.de/cpp/boost/ 不过代码可能 由于BOOST 版本不同需要稍作修改 scoped_ptr 离开作用域则自动调用类析构函 ...

  6. 【文件下载】Java下载文件的几种方式

    [文件下载]Java下载文件的几种方式  摘自:https://www.cnblogs.com/sunny3096/p/8204291.html 1.以流的方式下载. public HttpServl ...

  7. hadoop群集 启动

    ###注意:严格按照下面的步骤 .5启动zookeeper集群(分别在itcast04.itcast05.itcast06上启动zk) cd /itcast/zookeeper-/bin/ ./zkS ...

  8. Selenium安装中的一些问题及解决办法-软硕1703班3组整理分享

    非常感谢软件工程硕士1703班3组同学的热心,他们将安装Selenium过程中踩过的坑替大家填上了.希望还没有来得及踩坑的,或者掉进坑里还没爬出来的小组,能顺利跨过去这个安装的坑. 如下是原文. Se ...

  9. 着重基础之—Spring Boot 编写自己的过滤器

    Spring Boot 编写自己的"过滤器" 又好久没有写博客进行总结了,说实话,就是 "懒",懒得总结,懒得动.之所以写这篇博客,是因为最近对接公司SSO服务的时候,需要自定义拦 ...

  10. Repository模式中,Update总是失败及其解析(转)

    出处:http://www.cnblogs.com/scy251147/p/3688844.html 关于Entity Framework中的Attached报错的完美解决方案终极版 前发表过一篇文章 ...