我安排了很多活动,我想检查我的预定活动中是否有10天的间隔,在那10天内没有发生任何事件。是否有良好的数据结构和搜索算法找到10天的间隔?
答案 0 :(得分:0)
取决于您是否关心效率,内存使用等。如果所有其他方法都失败了,您可以使用O(n * log(n))算法按日期排序,并获取每个连续日期对之间的差异。
编辑:想想我现在更好地理解你的问题了。 两种选择: 1)假设日期被排序,二进制搜索它们在它们中的两个之间的增量<10时停止。也许您可以优先搜索具有更大日期范围的子阵列。这落在log n和n之间。 2)存储与上一个或下一个日期的差异与日期。使用优先级队列将它们按照上一个或下一个日期的差异进行排序。您可以在恒定时间内以最大差异弹出日期。
答案 1 :(得分:0)
我会使用有序的链表来存储事件,我也会将事件存储在哈希表(键:事件日期)中,这比下一个表至少提前10天。将新事件插入链接列表时,必须检查新事件与其邻居之间的日期差异。最多可以修改哈希表。
修改强>
也许不需要创建额外的哈希表。创建一个特殊的有序链表,其中list-item如下所示:
[EVENTDATE | nextEventPointer | next10DayEventPointer | previous10DayEventPointer]
next10DayEventPointer指向下一个事件,比下一个事件至少提前10天。 previous10DayEventPointer指向上一个事件,比前一个事件至少提前10天。
HEAD项next10DayEventPointer指向第一个事件,该事件至少早于下一个事件。 HEAD项的previous10DayEventPointer为NULL。
您可以使用next10DayEventPointer在HEAD查询10天事件。
在插入过程中,必须在必要时更新指针。
修改强>
像这样使用二进制搜索:
class Program
{
static void Main(string[] args)
{
Dictionary<int, int> result = new Dictionary<int, int>();
int [] dates = {2, 2, 2, 2, 2, 7,18, 19, 23, 33, 34, 35, 50, 70};
IsThereIntervalXBetween(dates, 10, 0, dates.Length - 1, result);
foreach (var key in result.Keys)
Console.WriteLine("Index:{0} Date:{1} Next:{2}",key,dates[key],dates[key+1]);
}
static void IsThereIntervalXBetween(int[] dates, int interval, int firstIndex, int lastIndex, Dictionary<int, int> result)
{
if (lastIndex - firstIndex == 1)
{
result.Add(firstIndex, dates[firstIndex]);
return;
}
int middleIndex = (firstIndex + lastIndex) / 2;
if (dates[middleIndex] - dates[firstIndex] >= interval)
IsThereIntervalXBetween(dates, interval, firstIndex, middleIndex, result);
if (dates[lastIndex] - dates[middleIndex] >= interval)
IsThereIntervalXBetween(dates, interval, middleIndex, lastIndex, result);
}
}
这是递归的,这不是优选的,但仍然很容易转换为非递归。
答案 2 :(得分:0)
你可以对链表进行排序以存储时间表,并将其存储在哈希映射中,其中日期为键,值为链表节点地址的地址。因此,搜索并查看您是否有10天的时间来安排其o(1)时间并将时间表插入其最长o(n)时间。