Hashtable?
Edit:
Массив O(1)
lookup, потому что a[i]
- это просто синтаксический сахар для *(a+i)
. Другими словами, чтобы получить O(1)
, вам нужен либо прямой указатель, либо легко вычисляемый указатель на каждый элемент (вместе с хорошим ощущением, что память, которую вы собираетесь искать, предназначена для вашей программы). При отсутствии указателя на каждый элемент вряд ли будет легко рассчитанный указатель (и мы знаем, что память зарезервирована для вас) без смежной памяти.
Конечно, возможно (если это ужасно) иметь реализацию Hashtable, в которой адрес памяти каждого поиска просто *(a + hash(i))
Не выполняется в массиве, т. Е. Создается динамически в указанной ячейке памяти, если у вас есть такой контроль ... дело в том, что наиболее эффективной реализацией будет базовый массив, но вполне вероятно, что в других местах возможны попадания для реализации WTF, которая все еще дает вам поиск в постоянном времени.
Edit2:
Я хочу сказать, что массив опирается на непрерывную память, потому что это синтаксический сахар, но Hashtable выбирает массив, потому что это лучший способ реализации, а не потому, что он требуется . Конечно, я, должно быть, слишком много читаю DailyWTF, так как я представляю, как перегружаю оператор индекса массива в C ++, чтобы делать это без смежной памяти тем же способом.