8个finds最好,因为代码更简单明了。
不过,考虑性能更有趣,所以我也会这样做。
正如 Artelius 在我写这个答案时所说,忽略复杂性。这无关紧要,因为您知道 n=100。例如,插入排序的算法复杂度比快速排序更差(至少在平均情况下),但在几乎所有实现中,对于小的 n,插入排序都比快速排序快,因此快速排序在接近尾声时突破为插入排序。您的 n 也很小,因此 n -> infinity 的限制并不重要。
由于这两个选项的代码都很容易编写,我建议对其进行分析。这将 (a) 告诉你哪个更快,并且 (b) 证明两者都非常快,以至于你做什么都没有关系(除非它是你的程序唯一做的事情,而且它做了很多事情)。尤其是当您谈论打开密钥时-如果密钥是整数类型,则限制因素更有可能是内存缓存问题,而不是任何实际处理。
然而,如果做不到这一点,通常比较搜索算法的方法是计算比较,假设它们比遍历结构要慢得多。如果不出意外,每次比较都会访问内存并且是一个不可预测的分支,这是 CPU 通常最不擅长的两件事。
如果您在开始之前对 8 个元素进行排序(大约需要 24 次比较)而不是您建议的开关,那么由于地图也已排序,您只需在遍历的每个节点上进行一次比较,以及每个项目进行一次比较您正在搜索(比较每个“边”的一个节点。如果它们匹配,则两边都增加。如果它们不匹配,则用较小的元素增加边)。所以在最坏的情况下是 8+100,或者如果你在结束之前找到所有 8 个,则更少。但是 8 个中最后一个的平均位置,如果它们随机位于地图中,仍然是大约 8/9 的位置。所以称它为 8+88+24 = 120 次比较,最坏的情况是 132 次。最好的情况是 8(如果您要搜索的东西都在开头)+24(用于初始排序)= 32 次比较,
红黑树(通常是映射)中节点的平均深度略高于 log2(n)。在这种情况下称它为 7,因为 2^7 是 128。所以找到 8 个元素应该进行 56 次比较。IIRC 红黑树的平衡特性是最深节点不超过最浅节点深度的两倍。所以最坏的情况深度是 floor(2*log2(n)),称之为 15,总共 120,最好的是 ceil(1/2 log2(n)),即 4。这又是 32 次比较。
因此,假设比较是唯一影响速度的因素,那么 8 次发现的速度将是线性遍历的 4 倍和 4 倍之间,平均要好 2 倍。
但是,线性遍历可能会触及更多内存,因此可能会更慢。但最终对于 n=100 你说的是毫秒时间,所以只要做最简单的代码(可能是 8 个发现)。我有没有提到如果你真的想知道你无法预测的速度,你只需要分析它吗?