У меня запланировано множество событий, и я хочу проверить, есть ли 10-дневный интервал в запланированных событиях, где в течение 10 дней не происходит никакого события. Есть ли хорошая структура данных и поиск, чтобы найти 10-дневный интервал?узнать больше о дате?
ответ
Зависит ли вы от эффективности, использования памяти и т. Д. Если все остальное не удается, вы можете сортировать по дате с использованием алгоритма O (n * log (n)) и принимать разницу между каждой последовательной парой дат.
EDIT: Думаю, я понимаю вашу проблему лучше сейчас. Два варианта: 1) Предполагая, что даты отсортированы, бинарный поиск их останавливается, когда приращение между двумя из них равно < 10. Возможно, вы могли бы искать подмассивы с более крупными диапазонами дат. Это находится где-то между log n и n. 2) Хранить разницу с предыдущей или следующей датой с датами. Используйте очередь приоритетов, чтобы сортировать их по разнице с предыдущей или следующей датой. Вы можете поместить дату с максимальной разницей в постоянное время.
Я бы использовал упорядоченный связанный список для хранения событий, а также я бы сохранил события в хеш-таблице (key: event date), которые по крайней мере на 10 дней раньше, чем следующая. Когда вы вставляете новое событие в связанный список, вы должны проверить разницу дат между новым событием и его соседями. До этого измените хэш-таблицу.
EDIT:
Может быть, нет необходимости для создания дополнительного Hashtable. Создать специальный упорядоченный связанный список, где список-элемент выглядит так:
[EVENTDATE | nextEventPointer | next10DayEventPointer | previous10DayEventPointer]
next10DayEventPointer указывает на следующее событие, которое, по крайней мере на 10 дней раньше, чем на следующий один. previous10DayEventPointer указывает на предыдущее событие, которое по крайней мере на 10 дней раньше следующего.
Элемент HEAD next10DayEventPointer указывает на первое событие, которое, по крайней мере, раньше следующего. Элемент HEAD previous10DayEventPointer равен NULL.
Вы можете запросить начало событий 10Day в HEAD, используя next10DayEventPointer.
Во время ввода вам необходимо обновить указатели, если это необходимо.
EDIT:
Используйте бинарный поиск, как это:
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);
}
}
Это рекурсивная, что не является предпочтительным, но все это легко превратить в нерекурсивна.
ok, когда я вставляю события в хэш-таблицу, если есть два события в течение 10 дней, я не могу вставить событие, как бы найти следующий доступный 10-й пустой слот для вставки события в logn? вы, похоже, похоже O (n) –
Я думаю, вы неправильно поняли вопрос, у меня запланированы события. предположим, что это даты событий, 3 5 8 10 12 14 15 19 23 33 34 39 40 45, и вы видите, что есть интервал (23-33) 10 дней. Я хочу найти этот интервал в logn –
В этом случае вы можете использовать двоичные деревья поиска. http://en.wikipedia.org/wiki/Binary_search_tree Каждый узел имеет два дочерних элемента, дочерний слева меньше родительского узла, а дочерний элемент справа больше родительского узла. – boli
Вы можете отсортировать связанный список, чтобы сохранить расписание, а также сохранить его на карте хэша с указанием даты в качестве ключа и значения в качестве адреса узла-адреса связанного списка. Поэтому для поиска и просмотра, есть ли у вас 10 дней для расписания, время o (1) и вставить расписание в максимальное время (n).
- 1. Узнать больше о парсинге
- 2. Узнать больше о Java
- 3. Узнать больше о распределенных вычислениях
- 4. Узнать больше о Facebook Уведомления?
- 5. Где я могу узнать больше о указателях?
- 6. Узнать больше о функции TOP 10
- 7. Как узнать больше о встроенных модулей
- 8. Узнать больше о СМС от конкретного отправителя
- 9. хотите узнать больше о Dynamic Ip
- 10. Хотите узнать больше о теории Thread
- 11. Где я могу узнать больше о pthreads?
- 12. Нужно больше узнать о сессиях в PHP
- 13. Как узнать больше о приложении Hang event?
- 14. Хотите узнать больше о COFF экстернов
- 15. Попытка узнать больше о механизмах ответа/вывода
- 16. узнать больше о запятой в MySql
- 17. Узнайте больше о LLVM
- 18. Где я могу узнать больше о зависимостях, используемых в Android
- 19. Где я могу узнать больше о формате файла PowerPoint 2010?
- 20. Узнать больше о подклассификации для целей пользовательского интерфейса?
- 21. Как узнать больше о MySQL, Apache и .htaccess?
- 22. Как узнать больше о спирали FIbbonaci в python?
- 23. Как я могу узнать больше о внутренних компонентах Python?
- 24. Хотелось бы узнать больше о функционировании этой части кода
- 25. Где я могу узнать больше о P/Invoke?
- 26. Каков наилучший способ узнать больше о анализаторах Roslyn Code
- 27. Где я могу узнать больше о функции перевода PyPy?
- 28. Где я могу узнать больше о xcode OpenGL?
- 29. Пример проекта, чтобы узнать больше о коллекциях Java
- 30. Где я могу узнать больше о релятивизациях P и NP?
Мне нужно время работы в режиме runn, а не пробел –
Да, это было довольно очевидное и неоптимальное предложение в ретроспективе. Вы ожидаете, что эта задача будет общей?Есть определенно несколько расточительных способов отслеживать интервалы между всеми датами, позволяя вам существенно выяснить, есть ли/где 10-дневный интервал существует в O (n) времени. – nickd717
Мне нужен алгоритм logn –