【问题标题】:Efficient search based on if a datetime value falls in a range基于日期时间值是否在一个范围内的有效搜索
【发布时间】:2017-08-09 13:57:31
【问题描述】:

更新的简洁问题

我有一个包含 DateTime 值列表的对象。这是假期列表以及一天的工作时间。

Item.cs

class Item
{
    public int SourceId { get; set; }
    public int DestinationId { get; set; }
    public int ChannelId { get; set; }
    public string Username { get; set; }
    public List<DateTime> Holidays { get; set; }
}

如果不是假期,我们可以将项目列表保存在字典中,以元组作为键。

要求

会有一个项目符合条件(因为有一个默认项目来处理没有项目匹配的情况)

属性会不时改变

1) 是否可以获取此类对象的哈希码,包括 Holidays 属性。

2)如果不是字典,如何为这种搜索设计具有最佳时间复杂度的数据结构

原帖不清楚

我实现了一个以元组为键的字典,到目前为止它工作得很好。

现有的字典键

Tuple<int, int, int, string>

现有的搜索方法

var item = default(item);
_dictinary.TryGetValue(new Tuple(1,1,1,""), out item);
return item;

因为搜索参数是固定的。

然而,现在出现了一个新要求,即元组项是动态的,即搜索参数的数量是可变的。我试图通过假设始终存在最大数量的搜索参数来保持数字不变,但是当另一个日期范围类型的搜索参数成为要求时,我碰壁了。这意味着我不能将字典作为基础数据结构。

因此,我需要知道当有多个条件(例如日期范围)时,有人会考虑使用哪种数据结构来尽可能保持搜索效率。

为了完整起见,让我说新的搜索参数是一个日期范围,称为假日。即我需要匹配今天是否在该假期的日期范围内,包括其他参数

Holiday.cs

public class Holiday
{
    public List<Day> Days{ get; set; }
}

其中 Day 是 DateTime 的包装,表示一年中的某一天。

总结 的组合 SourceId(int), DestinationId(int), ChannelId(int), Username(int), (IsTodayHoliday (Holiday-DateRanges)) 应该唯一地找到集合中的一项

我不能使用对象的哈希,因为搜索参数对象是具有日期范围的可变对象,并且范围不一定是连续的,至少我不知道如何获取此类对象的哈希

我完全理解匹配算法是必需的,正如我上面提到的,我肯定需要更改我的数据结构和字典不合适。我的问题非常具体到数据结构的设计以提高搜索复杂性。

【问题讨论】:

  • 您能否提供一个示例,说明您尝试搜索的数据点以及搜索它们的查询类型?
  • 我有一种强烈的感觉,你错过了使用字典作为搜索的主要结构。您可能需要使用 SearchParams 作为对象的自定义匹配谓词的输入(而不是使用字典的按键匹配)
  • 提高搜索复杂度的数据结构设计您是想说效率而不是复杂度吗?
  • @Dusan 是的,效率,我的意思是时间复杂度
  • 创建您想要的任何对象并使用hash 作为键。

标签: c# dictionary search


【解决方案1】:

由于dictionary 可用于不那么灵活的按键匹配, 我建议你使用普通列表和 linq:

class Item
{
    int a;
    int b;
    int c;
    string s;
    List<Day> days;
}

class SearchParams
{
    int a;
    int b;
    int c;
    string s;
    Day d1;
    Day d2;
}

// Populate items
var items = new List<Item>();
items.Add(...);

// Search items
var par = new SearchParams { ... };
var matches = items.Where(x=> 
    x.a == par.a &&
    x.b == par.b &&
    x.c == par.c &&
    x.s == par.s &&
    x.days.Any(d >= par.d1 && d <= par.d2)
);

【讨论】:

  • 感谢您的建议。但是,您能否解释一下这是如何尝试提高搜索时间复杂度的。当参数固定后,字典在保持搜索 O(1) 方面做得很好。这将大大降低搜索速度
  • @SrivathsaHarishVenkataramana 是的 - 范围搜索比单项搜索要困难得多...除非您想在适当的索引上投入大量资金,否则线性搜索很容易证明是可靠的替代方案。
  • 您只期待一场比赛吗?请更具体一点,向我们展示一些示例,这样我们就不必推测您的意图......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多