2017-01-20 7 views
2

Этот вопрос: asked on behalf пользователя reddit /u/Dasharg95.Какую структуру данных мы можем использовать для эффективной проверки доступности ресурсов?

Я хочу создать систему бронирования гостиничных номеров, где каждый номер отеля можно забронировать за любой набор временных рамок. Общий запрос к набору данных резервирования пытается выяснить, какие номера доступны для данного временного интервала. Существует ли структура данных для набора данных резервирования, которая позволяет эффективно выполнять такой запрос?

Например, скажем, у нас есть пять комнат со следующими раз оккупационных:

room 1: 9:00 -- 12:00, 15:00 -- 18:00, 19:30 -- 20:00 
room 2: 8:00 -- 9:30, 15:30 -- 17:30, 18:00 -- 20:00 
room 3: 6:30 -- 7:00, 7:30 -- 8:15 
room 4: 12:00 -- 20:00, 
room 5: 7:00 -- 14:15, 18:00 -- 21:55 

Я хочу структуру данных для времен оккупации, что является достаточно пространства эффективным и позволяет для следующих запросов, которые будут выполняться с разумное представление:

  • какое время данный номер занят для
  • какие номера свободны для полноты заданного периода времени
+0

Вам не нужна простая структура данных, вам нужна нормализованная реляционная база данных. Слишком широкий. – EJP

+0

@EJP Я не уверен, как реляционная база данных решит эту проблему. Можете ли вы написать ответ с объяснением того, какие запросы я могу использовать для каких отношений для решения этой проблемы? – fuz

+0

Ответ на этот вопрос будет зависеть от количества комнат, детализации временных рамок и общего количества доступных слотов. Если мы говорим несколько десятков комнат за один день, с 15-минутной детализацией, то наивного пути будет достаточно. Если вы говорите о тысячах комнат для отеля, где вы можете забронировать несколько лет за несколько дней, это совсем другое. –

ответ

0

Система 2D-массивов по-прежнему может быть полезна без использования большого ресурса. Номер комнаты может быть эквивалентно index-, например, индекс я это число номеров:

String [] = {"taken","not","taken","not","taken"} 

Индекс является позиция элемента

второй элемент, «нет», это индекс 1, поскольку первый элемент (элемент) является индексом нуля. Чтобы получить номер комнаты, добавьте индекс с 1, как будто в отеле всего одна комната, это будет «Комната 1», а не «Комната 0». Таким образом, индекс + 1 имеет номер.

Если вы назначаете время с равным размером (xxxx.yyyy, с xxxx - время открытия, а yyyy - закрытие), вы можете вырезать половину элемента с помощью подстроки, чтобы получить первые четыре/последние четыре символов на время, распечатав его, поместив двоеточие в середину xxxx, например xx: xx.

оно может быть сохранено в простой 1D массив, например, так:

String [] rooms = {"0900.1200", "1500.1800", "1930.2000") 

...... редактировать, просто понял, что в те времена было бы для одной комнаты (х ...

Таким образом, чтобы назначить несколько раз для одной комнаты вы можете использовать систему форматирования - как:

// * = the next four digits are the opening time 
// - = the next four digits are the closing time 

Таким образом, можно провести несколько раз в одном элементе, как: `{" * 0800-0930 * 1530- 1730 * 1800 * 2000 ", ....}

Его чрезвычайно сложно, но для этого используется только один массив, и компьютер может использовать цикл while, чтобы проверить, есть ли больше времени после закрытия -> если их нет, перейдите к следующему элементу/множеству раз , номер комнаты/индекс.

После того, как вы пройдете через все элементы, проверка номера завершена.

+1

Это хорошее решение для многих практических случаев. Однако проблема состоит в том, что для этого требуется квантование времени занятий, которое может быть непростым. Кроме того, требуется довольно большое пространство. У вас есть идея, возможно ли лучшее решение? – fuz

+0

@fuz связанный список/динамическая коллекция может быть идеей - она ​​использует только то же количество бара, сколько ему нужно, в отличие от массива с постоянным размером, он настраивается соответственно количеству данных. Это наиболее эффективная структура данных. – Samuelf80

+0

С вашим редактированием я не уверен, как эта структура данных полезна. Можете ли вы проиллюстрировать, как проверить, какие номера доступны в течение определенного периода времени? Обратите внимание, что для этого временного интервала может быть доступно только небольшое количество комнат, поэтому может оказаться полезным решение, которое не нужно перебирать по всем комнатам. Кроме того, список времени, в течение которого комната занята, может расти довольно большой, проходя через весь список занятий, чтобы каждый чек звучал довольно медленно. – fuz

0

Только представьте, хотите ли вы иметь его в промежутке 15 минут, тогда у вас будет 24 × 4 = 92 разных интервала с первым от 0:00 до 0:15.Поместите это в двоичный файл с некоторой дополнительной информацией, чтобы проверить, выбрали ли вы подходящую комнату u, чтобы использовать 100 бит. Теперь вы создаете функции для создания битовой строки и расшифровываете строку для хранения строк в массиве. Готово.

+0

Обратите внимание, что это всего лишь пример. В реальных приложениях существует длительный срок для сохранения (10 лет или около того), более тонкой детализации и многих других комнат. – fuz

 Смежные вопросы

  • Нет связанных вопросов^_^