找到日期的差异?

时间:2013-02-27 16:40:16

标签: algorithm data-structures tree linked-list skip-lists

我安排了很多活动,我想检查我的预定活动中是否有10天的间隔,在那10天内没有发生任何事件。是否有良好的数据结构和搜索算法找到10天的间隔?

3 个答案:

答案 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)时间。