【发布时间】:2011-04-15 02:05:53
【问题描述】:
我目前正在学习数据结构的大学课程,这个话题已经困扰了我一段时间(这不是家庭作业,只是一个纯粹的理论问题)。
假设您要实现一个字典。当然,字典应该有一个搜索功能,接受一个键并返回一个值。
现在,我只能想象 2 种非常通用的方法来实现这样的事情:
- 使用某种搜索树,这将(总是?)给出 O(log n) 最坏情况下的运行时间来通过键查找值,或者,
- 对键进行散列运算,本质上返回一个自然数,该自然数对应于值数组中的索引,给出 O(1) 最坏情况的运行时间。
如果不使用数组,搜索函数的运行时间是否可能为 O(1)最坏情况?
是否只能通过使用数组进行随机访问?
是否可以通过使用基于指针的数据结构(如链表、搜索树等)?
在做出一些特定假设时是否可能,例如,键是按某种顺序排列的?
换句话说,你能想到搜索函数和字典的实现(如果可能的话),它将接收字典中的任何键并返回其值 O (1) 时间,不使用数组进行随机访问?
【问题讨论】:
-
如果你有完美的散列,散列表在最坏的情况中只有 O(1)。在实践中,散列表在平均情况中为 O(1),在最坏情况下通常为 O(n)。
-
有趣的见解。我对哈希表的实现方式不是很熟悉,它们通常不是像我建议的第二种方法那样实现吗?
-
是的,但在实际用例中,您需要考虑哈希冲突。 Wikipedia 有一个简单的概述,可以帮助您入门。
-
考虑哈希冲突意味着每个表条目可能包含多个值,因此它必须有一个数组。根据您对“无数组”要求的解释有多严格,这可能意味着此问题不允许使用哈希表解决方案。
-
@Sherm:表条目可能有链表,所以更具体地说,“没有数组”意味着没有可以像问题中的第二种方法一样使用的数组 - 防止随机访问数组.
标签: data-structures theory performance