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 ...
随机推荐
- 向mysql数据库插入大量数据
1. package com.zy.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.P ...
- .NET中CORS跨域访问WebApi
我这里只写基本用法以作记录,具体为什么看下面的文章: http://www.cnblogs.com/landeanfen/p/5177176.html http://www.cnblogs.com/m ...
- 解决Pycharm添加虚拟解释器的报错问题
问题背景: 新添加一个virtualenv环境时,需要安装指定的django==1.9.8,但是在添加解释器时,总报一个fuck egg的问题!! 解决方式如下: 1. 2. 3.搞定
- Win10 激活
先看看你的WIN10激活状态:1.右键开始菜单2.运行3.slmgr.vbs -xpr KMS卸载方法:1.如果是KMSPico,则自带服务卸载批处理,2.不管是哪种KMS工具,卸载掉软件之后请执行以 ...
- c++之boost share_ptr
转载:https://www.cnblogs.com/welkinwalker/archive/2011/10/20/2218804.html
- [ Laravel 5.5 文档 ] 底层原理 —— 一次 Laravel 请求的生命周期
Posted on 2018年3月5日 by 学院君 简介 当我们使用现实世界中的任何工具时,如果理解了该工具的工作原理,那么用起来就会得心应手,应用开发也是如此.当你理解了开发工具如何工作,用起 ...
- Vue.js2 + Laravel5 采用 CORS 方式解决 AJAX 跨域的问题
一.建立中间件 php artisan make:middleware CorsAjax 二.编写中间件 CorsAjax <?phpnamespace App\Http\Middleware; ...
- 13 Maven 编写插件
Maven 编写插件 Maven 的任何行为都是由插件完成的,包括项目的清理.绵编译.测试以及打包等操作都有其对应的 Maven 插件.每个插件拥有一个或者多个目标,用户可以直接从命令行运行这些插件目 ...
- python常用模块及面向对象(一)
目录: 常用模块之time模块 常用模块之random模块 常用模块之os模块 常用模块之sys模块 常用模块之subprocess模块 常用模块之json模块 常用模块之pickle模块 常用模块之 ...
- KOBAS
1. What is KOBAS 3.0? KOBAS (KEGG Orthology Based Annotation System) is a web server for gene/protei ...