【发布时间】:2013-08-22 13:17:22
【问题描述】:
我正在实现一个 VM 编译器,当然,我已经到了实现开关的地步。同样自然地,对于短开关,顺序查找数组将是最佳的,但更大的开关呢?
到目前为止,我已经想出了一个数据结构,它可以让我有一个很好的查找时间。我不知道该结构的名称,但它类似于二叉树,但它是整体式的,不同之处在于它仅适用于一组静态整数,不能添加或删除。它看起来像一个表格,其中值从顶部和右侧递增,这是一个示例:
整数 -89、-82、-72、-68、-65、-48、-5、0、1、3、7、18、27、29、32、37、38、42、45、54 , 76, 78, 87, 89, 92
还有桌子:
-65 3 32 54 92
-68 1 29 45 89
-82 -5 18 38 78
-89 -48 7 37 76
这给了我最坏的情况width + height 迭代。假设情况是37,-65小于37,所以向右移动,3向右移动,32向右移动,54更大所以向下移动(步幅宽度,因为它是无论如何顺序数组),45 更大所以向下移动,38 更大所以向下移动,我们在 7 跳中有 37 个。
有没有更快的查找算法?
另外,这种安排有名称吗?我自己想出了它,但很可能是别人在我之前做的,所以它很可能已经命名了。
编辑:好的,据我所知,“完美哈希”将为我提供更好的理论性能。但这将如何在现实生活中发挥作用?如果我理解正确,两级“完美哈希”将被分散而不是连续的内存块,因此虽然理论上的复杂性较低,但在获取该内存之前可能会有数十个甚至数百个周期的潜在损失。相比之下,理论上较慢的最坏情况场景实际上会表现得更好,因为它比完美哈希更缓存友好......或者不是?
【问题讨论】:
-
对排序列表进行二分搜索将在最多 5 次迭代中找到您的项目。 (在这个 20 项的列表中。)二分查找是 O(log n)。因此,从一百万个项目的列表中查找某些内容只需要 20 次迭代。
-
@JimMischel - 无论案件数量如何?我正在使用排序列表,但我需要宽度 + 高度迭代...
-
为什么不存储遇到的整数并使用哈希表查找它们的索引?
-
这只是一个菱形的二叉树。如果您想要更快的访问速度,我们可以使用平衡树或哈希表。如果在编译时所有数字都已知,您甚至可以构建一个完美的哈希。
标签: arrays algorithm performance switch-statement lookup