2016-12-14 3 views
1

В настоящее время у меня есть проблема, что я пытаюсь выяснить, но не уверен, что мои ответы верны.Hash Tables или BST?

У вас есть 1 миллион записей. В этих записях вам часто нужно искать по два критерия: идентификатор сотрудника и заработная плата (но не оба одновременно). У вас есть следующие ограничения:

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

  • Ваша программа должна быть достаточно быстрой. Простое сканирование всех элементов для каждого поиска будет слишком медленным.

Какая структура данных вы бы использовали?

Мой ответ?

Я хотел бы использовать хэш-таблицу, потому что в худшем случае будет O (+1000000) = O (1)

Как вы извлекаете записи при поиске по ID?

Как вы получите запись при поиске по зарплате?

+0

Вам понадобится поиск по диапазону зарплаты? (например, «показать мне все зарплаты между $ 20 000 и $ 25 000» или аналогичные?) Если это так, вам нужно будет просмотреть всю хэш-таблицу (O (N)), так как только поиск в хэш-таблице O (1) работайте, если вы знаете точное ключевое значение (ы), которое вы ищете ... –

+0

«Использовать хеш-таблицу» - это только начало ответа. Как вы собираетесь искать по двум ключам только с одной копией данных? Я думаю, что именно этот вопрос пытается исследовать ваши знания. Выбор между деревом и хеш-таблицей является вторичным, и вы можете использовать оба. Подумайте о недостающих деталях. Вам придется искать по целому ряду окладов - что реально - или конкретное значение в долларах - не так полезно? Разница имеет значение. – Gene

+0

@JeremyFriesner хорошо для ID, я бы знал точное местоположение, я сначала сортирую идентификаторы, а затем использую хэш? но за зарплату у вас есть точка .... –

ответ

1

Я ожидал бы многих проблем с столкновением для хэш-таблицы на основе зарплаты, но один для ID мог бы работать без столкновений довольно легко, используя небольшую криптографическую теорию. Кажется странным хотеть найти по зарплате, а не сортировать или получить некоторый диапазон, который можно было бы сделать намного проще на BST.

Недостаток этого заключается в том, что если вы хотите выполнить поиск по двум независимым объектам, вам придется поддерживать две структуры. К счастью, существуют указатели, поэтому вам не нужно хранить несколько копий. Лично я бы держать хэш-таблицу идентификаторов ссылок, затем BST зарплаты до ссылки, но если я ограничен одним типом данных я должен был бы сделать BST с узлами, как это:

Node { 
     int id; 
     Node idLessThan; 
     Node idGreaterThan; 

     int salary; 
     Node salaryLessThan; 
     Node salaryGreaterThan; 

     Data fileInfo; 
    } 

Создание по существу двух BST на одном наборе узлов.

+0

Я комментировал мышление то же самое. Но что, если зарплаты уникальны? будет ли хэш-таблица лучше? –

+0

Если вы хотите искать только по зарплате, а не по зарплате, это будет более эффективно как в памяти, так и в режиме доступа. Любая ситуация, о которой я могу думать, в которой вы хотели бы иметь возможность искать точную зарплату, довольно надуманна. – kcazllerraf

+0

Так что если я ищу только, было бы эффективно использовать BST. Я понимаю, но у меня вопрос, чтобы проверить наше понимание понятий. –