字典是快速查找时间的最佳选择吗?

时间:2017-05-19 01:03:07

标签: c# performance dictionary

我的代码在列表中有一系列路标。而我正试图找到一种简单的方法来找到一个位置的方式点:

Vector2 for waypoint.position

所以目前我决定使用字典:

<Vector2, int> indexer

因此,字典在列表中包含给定位置的航点的索引。

当问到这是否是一个好方法时,我最终得到关于排序算法和使用树作为更好的选项的答案 - 这让我感到困惑,因为我总是被告知字典有利于快速查找时间。

有人甚至提到过这样一个事实:我无法保证字典的哈希值与“桶”有关,所以它甚至可能不比迭代列表和检查每个位置更快一个,但我不知道这是什么意思,因为我不知道词典在做什么。

这是快速查看的好方法吗?或者我错误地使用了字典?有没有比我目前的方法更快的方法?

对我而言,性能是一个大问题,因为路数的数量可能会超过一千,并且有时会每隔几帧进行一次查找。

2 个答案:

答案 0 :(得分:0)

以下是一些数据结构的基本基准: http://theburningmonk.com/2011/12/performance-test-sorteddictionary-vs-dictionary-vs-map-vs-array/

从其他一些来源看,似乎向列表添加项目通常更快,除非您预先分配字典大小。

然而,无论大小如何,字典在查找值方面都会更快。随着大小的增加,List会越来越慢。

因此,这归结为实施。假设您需要向数据结构添加5000个航点,然后找到4000个航点。这种情况最适合使用 List。这是因为您只需要迭代一次以找到每个航点(如果可能的话)。查找80%的词典是没有意义的。

但是如果预先将航点加载到内存中会怎么样?在任何情况下,字典都是你最安全的赌注。

现在,也许你只需要在内存中查找5%的航路点。那么你最好的选择也是字典,因为绝大多数航路点都不需要考虑,所以查看5%比整个迭代更容易。

有多大差异?

不多。数据结构的基准似乎非常快。字典可能是您最安全的选择,但如果您有一些特殊情况,如上所列,您可能需要考虑一个列表。

没有具体的答案

每个节目都不同。使用词典和一些列表可以更好地解决一些问题。我不太了解你的情况,给你绝对正确的答案。

那我该怎么办才能确定?

您可以提供更多详细信息,并希望陌生人在C#数据结构基准测试方面拥有丰富的经验,或者您可以自行测试。

尝试将数十万个对象加载到列表中,遍历它们并记录时间。然后再做一次,但使用词典查找它们。自己看结果。

树木和图表等等呢?

树木和图表将对象相互存储。从您的问题来看,您似乎只有任意的航路点。不需要关系。

图形用于寻路。它们有助于计算每个点之间的距离。树是父子关系,对此类问题没有任何好处

其他来源: http://net-informations.com/faq/general/dictionary-list.htm

答案 1 :(得分:0)

字典如果快。我不知道在查找中比Dictionary更快的任何常用数据结构。要了解字典的工作原理,您需要阅读哈希表。关于哈希冲突的提及是正确的,但只有在你有冲突时才会这样。由于您几乎已经了解了数据集,因此您可以使用自定义哈希函数来减少冲突,甚至完全消除冲突。

但你还需要考虑更新。当您在列表中间插入一个点并且需要更新之后的所有点时,您将如何更新字典?如果更新不频繁,您只需向Vector2类添加索引字段并记住索引即可。对不起,我建议了另一种选择。

但坦率地说,对于你的小数据量,是一千点是小尺寸,我不确定它有多重要。您需要衡量所有方法的差异。

相关问题