Data structures 不同的字典实现

Data structures 不同的字典实现,data-structures,dictionary,Data Structures,Dictionary,我正在准备一场算法分析考试,在我学习了C#并以不同的方式实现了字典之后,我对其优缺点感到困惑 下面是我的问题: 使用无序数组而不是总是排序数组实现字典的原因是什么 为什么要使用总是排序的数组而不是无序数组来实现二分位数 使用二进制搜索树而不是始终排序的数组实现字典的原因?如果使用无序数组,则可以将项目固定到末尾,或者将数组复制到新数组中,如果原始数组已满,则将项目固定到末尾。O(1)或O(n)取决于这两种情况来插入,但O(n)可以执行任何查找 使用有序数组,您可以通过二进制搜索或其他酷炫的搜索,

我正在准备一场算法分析考试,在我学习了C#并以不同的方式实现了字典之后,我对其优缺点感到困惑

下面是我的问题:

使用无序数组而不是总是排序数组实现字典的原因是什么

为什么要使用总是排序的数组而不是无序数组来实现二分位数


使用二进制搜索树而不是始终排序的数组实现字典的原因?

如果使用无序数组,则可以将项目固定到末尾,或者将数组复制到新数组中,如果原始数组已满,则将项目固定到末尾。O(1)或O(n)取决于这两种情况来插入,但O(n)可以执行任何查找

使用有序数组,您可以通过二进制搜索或其他酷炫的搜索,根据其内容更快地进行搜索,但它增加了插入成本,因为每次插入数组时都必须移动数组中的内容,除非您只是按排序顺序添加内容,在这种情况下,它甚至可能是最坏的情况,即每个元素的O(n)


使用二叉搜索树,您可以根据在O(logn)时间内分叉树的内容轻松找到要查找的节点,尽管这仅在平衡二叉树上才可能。使用不平衡的二叉搜索树(基本上是一个链表),您可以获得O(n)的最坏情况性能。然而,使用平衡树时,插入的代价可能会更高,因为它需要重新组织通常为O(n log n)的树,但是O是最坏的情况,最平衡的二叉搜索树可以更快地执行大多数插入。

哪个impl insert/deletes/lookup最快?哪一个使用最少的内存?C#和它有什么关系?不要唠叨,但要小心使用数组、列表和字典等术语。在C#(和大多数其他语言)中,字典通常需要使用键,在这种情况下,查找是通过哈希而不是搜索来完成的。谢谢您的总结。我不确定您是如何计算成本的……我知道使用不同的排序算法对数组进行排序的成本是多少,但对树进行排序的成本相同吗?