Arrays perl-在大型/排序/数组中搜索字符串索引
我有一个大约100000件物品的大阵列,和一个大约1000件物品的小阵列。我需要在大数组中搜索小数组中的每个字符串,并需要返回字符串的索引。(因此我需要搜索100k阵列1000次) 大数组已经排序,所以我想某种二进制切块类型的搜索比使用foreach循环(找到循环时使用“last”来打断循环)要高效得多,这正是我开始使用的。(第一次尝试的结果是大约3000万次比较!) 是否有一种内置的搜索方法可以产生更有效的结果,或者我必须手动编写二进制搜索代码?我还希望避免使用外部模块Arrays perl-在大型/排序/数组中搜索字符串索引,arrays,perl,Arrays,Perl,我有一个大约100000件物品的大阵列,和一个大约1000件物品的小阵列。我需要在大数组中搜索小数组中的每个字符串,并需要返回字符串的索引。(因此我需要搜索100k阵列1000次) 大数组已经排序,所以我想某种二进制切块类型的搜索比使用foreach循环(找到循环时使用“last”来打断循环)要高效得多,这正是我开始使用的。(第一次尝试的结果是大约3000万次比较!) 是否有一种内置的搜索方法可以产生更有效的结果,或者我必须手动编写二进制搜索代码?我还希望避免使用外部模块 出于这个问题的目的,假
出于这个问题的目的,假设我需要在大型排序数组中查找单个字符串的索引。(我只提到1000个项目来说明规模)这听起来像是经典的哈希用例场景
my %index_for = map { $large_array[$_] => $_ } 0 .. $#large_array;
print "index in large array:", $index_for{ $small_array[1000] };
这听起来像是经典的散列用例场景
my %index_for = map { $large_array[$_] => $_ } 0 .. $#large_array;
print "index in large array:", $index_for{ $small_array[1000] };
在这里,使用二进制搜索可能是最佳选择。二进制搜索只需要O(logn)比较(这里每个查找大约17次比较) 或者,您可以创建一个哈希表,将项目映射到其索引:
my %positions;
$positions{ $large_array[$_] } = $_ for 0 .. $#large_array;
for my $item (@small_array) {
say "$item has position $positions{$item}";
}
虽然现在每个查找都可以在O(1)中进行,而无需进行任何比较,但必须首先创建哈希表。这可能更快,也可能不会更快。请注意,哈希只能对键使用字符串。如果您的项是具有自身相等概念的复杂对象,则必须首先导出合适的键。使用二进制搜索可能是最佳选择。二进制搜索只需要O(logn)比较(这里每个查找大约17次比较) 或者,您可以创建一个哈希表,将项目映射到其索引:
my %positions;
$positions{ $large_array[$_] } = $_ for 0 .. $#large_array;
for my $item (@small_array) {
say "$item has position $positions{$item}";
}
虽然现在每个查找都可以在O(1)中进行,而无需进行任何比较,但必须首先创建哈希表。这可能更快,也可能不会更快。请注意,哈希只能对键使用字符串。如果您的项是具有自身相等概念的复杂对象,则必须首先导出合适的键。为什么要避免使用外部模块?并不是说我知道一个完全符合要求,但是你可以试试,看看它是否足够快,然后修改它以返回索引;我没有寻找其他的CPAN模块。还有。在实现您自己的任何东西之前,我会尝试使用模块。这个数组已经在Perl数组中了,还是存储在磁盘上?在后一种情况下,它是否适合您的主内存?如果不是的话,即使这排除了二进制搜索,也可以更快地不同时将其全部拉入主内存。您正在搜索的字符串是否完全匹配?或者它们可能是大型数组项的子字符串?为什么要避免使用外部模块?并不是说我知道一个完全符合要求,但是你可以试试,看看它是否足够快,然后修改它以返回索引;我没有寻找其他的CPAN模块。还有。在实现您自己的任何东西之前,我会尝试使用模块。这个数组已经在Perl数组中了,还是存储在磁盘上?在后一种情况下,它是否适合您的主内存?如果不是的话,即使这排除了二进制搜索,也可以更快地不同时将其全部拉入主内存。您正在搜索的字符串是否完全匹配?或者它们可能是大数组项的子字符串?那么,如果我只想在大数组中找到字符串“bob”的索引,这将如何工作?@jxm
$index_for{“bob”}
(bob
周围的引号是可选的),那么如果我只想找到字符串“bob”的索引,这将如何工作呢在大数组中?@jxm$index_代表{“bob”}
(围绕bob
的引号是可选的)