求1数据结构,给定一个时间值,在时间范围内快速查找,求方法,思路

startstartsvip 2012-03-14 06:51:26


一个子项,有开始时间,有结束时间,单独子项时间不重叠, 给定一个 时间,如何快速 查到该项?

示例(时间用double):



class 日常活动{

double 开始时间;
double 结束时间;
string 活动记录;

}


class 个人记录{
日常活动[] 我的记录A;

public string 活动记录A在时间点(double 随机输入时间){} // 这里有没有高效的(非遍历)方法?
}



一直用遍历,

求更好的实现方法

什么都能改,可以用别的数据结构,可以预处理,只求高效


...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
startstartsvip 2012-03-15
  • 打赏
  • 举报
回复
多谢楼上各位回复
EnForGrass 2012-03-15
  • 打赏
  • 举报
回复
既然有开始和结束时间,也保证了时间项不重复,二分查找应该算比较快的,
gomoku 2012-03-15
  • 打赏
  • 举报
回复
单项不重叠就好办了。

注意以下例子中的
BinarySearch: 二分查找,复杂度log(N)。
orderby:排序了才能二分查找。
IComparable:可比较才能排序。

class Program
{
static void Main(string[] args)
{
个人记录 records = new 个人记录(new 日常活动[]
{
new 日常活动(){开始时间 = 7, 结束时间 = 7.5, 活动记录 = "早餐"},
new 日常活动(){开始时间 = 9.0, 结束时间 = 11, 活动记录 = "客户会议"},
new 日常活动(){开始时间 = 12, 结束时间 = 13, 活动记录 = "午餐"},
new 日常活动(){开始时间 = 14, 结束时间 = 18, 活动记录 = "娱乐"},
}
);
string 记录0 = records.活动记录在时间点(8); // null
string 记录1 = records.活动记录在时间点(12.5); // 午餐
string 记录2 = records.活动记录在时间点(14); // 娱乐
string 记录4 = records.活动记录在时间点(20); // null
}
}

class 日常活动 : IComparable<日常活动>
{
public double 开始时间;
public double 结束时间;
public string 活动记录;
public int CompareTo(日常活动 other)
{
if (this.开始时间 < other.开始时间) return -1;
if (this.开始时间 > other.开始时间) return +1;
return 0;
}
}
class 个人记录
{
日常活动[] 我的记录A;
public 个人记录(IEnumerable<日常活动> 活动记录)
{
this.我的记录A = 活动记录.OrderBy(r => r.开始时间).ToArray();
}
public string 活动记录在时间点(double 时间点)
{
int hit = Array.BinarySearch<日常活动>(this.我的记录A, new 日常活动() { 开始时间 = 时间点 });
if (hit < 0) hit = (~hit) - 1;
if (hit >= 0 && 我的记录A[hit].开始时间 <= 时间点 && 时间点 <= 我的记录A[hit].结束时间) return 我的记录A[hit].活动记录;
return null;
}
}
threenewbee 2012-03-15
  • 打赏
  • 举报
回复
用Linq+字典。
startstartsvip 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gomoku 的回复:]
单项不重叠就好办了。

注意以下例子中的
BinarySearch: 二分查找,复杂度log(N)。
orderby:排序了才能二分查找。
IComparable:可比较才能排序。
C# code

class Program
{
static void Main(string[] args)
{
个人记录 records = new 个人记录(new……
[/Quote]


三楼答案已验证, 正解
jshi123 2012-03-15
  • 打赏
  • 举报
回复
排序,然后用2分找,或者按日期分段建索引

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧