【发布时间】:2009-10-30 15:13:15
【问题描述】:
我需要实现具有随机访问的自排序数据结构。有什么想法吗?
【问题讨论】:
-
先试试搜索引擎。由于 OP 对做基本功课缺乏热情,投票结束。
-
别着急。这并不像第一次看那么容易。
-
是的,请指出您尝试了什么,以及什么无法发挥作用。
标签: data-structures
我需要实现具有随机访问的自排序数据结构。有什么想法吗?
【问题讨论】:
标签: data-structures
自排序数据结构可以是二叉搜索树。如果你想要一个自排序的数据结构和一个自平衡的数据结构。 AVL树是要走的路。随机访问的检索时间将为 O(lgn)。
【讨论】:
维护一个排序列表并任意访问它至少需要 O(lgN) / 操作。因此,寻找AVL、red-black trees、treaps 或任何其他类似的数据结构并丰富它们以支持随机索引。我建议treaps,因为它们是最容易理解/实现的。
丰富树形树的一种方法是在每个节点中保留以该节点为根的子树中的节点数。修改树时必须更新计数(例如:插入/删除)。
【讨论】:
我最近不太关心数据结构的实现。可能这个答案根本不是答案……您应该看到 Thomas Cormen 编写的“算法简介”。那本书有许多“食谱”,解释了许多数据结构的内部工作原理。 另一方面,您必须考虑要花多少时间编写算法、输入的大小以及是否确实需要某种特殊的数据结构。
【讨论】:
我发现这里的答案缺少一件事,即 Skiplist https://en.wikipedia.org/wiki/Skip_list
您自动获得订单,搜索和创建有一个概率元素。
适合这个问题并不比二叉树差。
【讨论】:
自分类有点模棱两可。首先
什么样的数据结构?
有很多不同的数据结构,例如:
还有更多,他们每个人的行为都与其他人不同,当然也有他们的好处。
现在,并非所有这些都可以或应该是自排序的,例如 Stack,如果那个是自排序的,那就太奇怪了。
但是,链表和二叉树可以是自排序的,为此您可以在不同的时间以不同的方式对其进行排序。
对于链接列表
我更喜欢Insertion sort,您可以在 wiki 和其他地方阅读各种关于此的好文章。我喜欢粘贴的链接。查看它并尝试理解这个概念。
如果你想在插入后进行排序,即在随机时间,那么你可以实现一个不同于插入排序的排序算法,bubblesort 或者 quicksort,不过我会避免使用冒泡排序,这是一个慢很多!但更容易让人喘不过气来。
随机访问
随机总是被讨论的东西,所以请阅读有关如何执行良好随机化的内容,如果你有一个链接列表并且有一个“getAt”方法,你可以随机化一个索引在 0 和 n 之间并获取该索引处的项目。
【讨论】: