Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays perl-在大型/排序/数组中搜索字符串索引_Arrays_Perl - Fatal编程技术网

Arrays perl-在大型/排序/数组中搜索字符串索引

Arrays perl-在大型/排序/数组中搜索字符串索引,arrays,perl,Arrays,Perl,我有一个大约100000件物品的大阵列,和一个大约1000件物品的小阵列。我需要在大数组中搜索小数组中的每个字符串,并需要返回字符串的索引。(因此我需要搜索100k阵列1000次) 大数组已经排序,所以我想某种二进制切块类型的搜索比使用foreach循环(找到循环时使用“last”来打断循环)要高效得多,这正是我开始使用的。(第一次尝试的结果是大约3000万次比较!) 是否有一种内置的搜索方法可以产生更有效的结果,或者我必须手动编写二进制搜索代码?我还希望避免使用外部模块 出于这个问题的目的,假

我有一个大约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
的引号是可选的)