我有大约100,000件商品,还有大约1000件商品。我需要在大数组中搜索小数组中的每个字符串,我需要返回字符串的 index 。 (所以我需要搜索100k阵列1000次)
大数组已经排序了所以我猜某种二进制斩波类型搜索比使用foreach循环(使用' last'在发现时打破循环)更有效率这是什么我开始了。 (这第一次尝试导致了大约30米的比较!)
是否有内置的搜索方法可以产生更有效的结果,或者我是否必须手动编码二进制搜索?我也想避免使用外部模块。
出于问题的目的,假设我需要在大型排序数组中找到单个字符串的索引。 (我只提了1000个项目,以便了解比例)
答案 0 :(得分:4)
这听起来像经典哈希用例场景,
my %index_for = map { $large_array[$_] => $_ } 0 .. $#large_array;
print "index in large array:", $index_for{ $small_array[1000] };
答案 1 :(得分:2)
在这里使用二分搜索可能是最佳选择。二进制搜索只需要O(log n)比较(这里每次查找约17次比较)。
或者,您可以创建一个将项目映射到其索引的哈希表:
my %positions;
$positions{ $large_array[$_] } = $_ for 0 .. $#large_array;
for my $item (@small_array) {
say "$item has position $positions{$item}";
}
虽然现在可以在O(1)中进行每次查找而无需进行任何比较,但您必须首先创建哈希表。这可能会更快,也可能不会更快。请注意,哈希只能使用字符串作为键。如果您的项目是具有自己的相等概念的复杂对象,则必须首先导出合适的密钥。