1. 程式人生 > 其它 >時間條合併演算法優化(區間合併)

時間條合併演算法優化(區間合併)

技術標籤:演算法設計

/*
需求示意:
已知有M段不連續的時間段,[t1,t2],[t2,t3],[t3,t4],[t6,t7],[t7,t8],[t9,t10]
合併後應為:[t1,t4],[t6,t8],[t9,t10],則缺失[t4,t5]的時間段。
條件:時間段前後為閉包,
目的:將滿足條件的零碎片段拼接為一段連續的大片段,並輸出拼接後的片段.
*/

struct  TyTime
{
	int start;
	int end;
};



vector<TyTime> merge(vector<TyTime>& m_vcTyTime)
{
	if (m_vcTyTime.
size() <= 1) { return m_vcTyTime; } vector<TyTime> res; //排序,按開始時間從小到大 sort(m_vcTyTime.begin(), m_vcTyTime.end(), [](TyTime a, TyTime b){return a.start < b.start; }); int i = 0; TyTime temp = { m_vcTyTime[0].start, m_vcTyTime[0].end }; while (i < m_vcTyTime.size()) { temp.start =
m_vcTyTime[i].start; temp.end = m_vcTyTime[i].end; while (i < m_vcTyTime.size()) { //注意陣列越界 if (i < m_vcTyTime.size() - 1 && temp.end >= m_vcTyTime[i + 1].start) { if (temp.end < m_vcTyTime[i + 1].end) { temp.end = m_vcTyTime[i + 1].end; }
i++; } else { i++; break; } } res.push_back(temp); } return res; } void main() { vector<TyTime>t1{ { 1, 2 }, { 2, 3 }, { 3, 4 }, { 5, 6 }, { 6, 7 }, { 8, 9 } }; cout << "合併前:\n"; for (auto node : t1) { cout << "[" << node.start << "," << node.end << "],"; } cout << endl; cout << "合併後:\n"; vector<TyTime>t2 = merge(t1); for (auto node : t2) { cout << "[" << node.start << "," << node.end << "],"; } cout << endl; system("pause"); }

結果:
在這裡插入圖片描述