我有两个类Record
数组。类Record
的定义如下
class Record{
char* string; //the word string
int count; //frequency word appears
}
这些是定义的两个数组(已经初始化)
Record recordarray1=new Record[9000000]; //contains 9000000 unsorted Records
Record recordarray2=new Record[8000000] //contains 8000000 unsorted Records
目的是找到两个数组之间匹配的字符串,并将它们添加到一个新数组中,在那里将它们的计数加在一起,如果有一个字符串不在另一个数组中,那么只需添加到新数组。为此,我尝试先对两个数组进行排序(按字母顺序排列),然后比较recordarray2
,如果字符串匹配则提前recordarray2
的索引,否则提前recordarray1
' s索引,直到找到一个。如果找不到,请将其添加到新数组中。
不幸的是,这种方法太慢了,使用STL排序排序本身需要20多秒。有没有更快的标准排序方法,我错过了?
答案 0 :(得分:0)
如果我理解正确,您的算法应该O( nlogn + mlogm
[对两个数组进行排序] + n + m
[通过数组并进行比较] )
。
它可能不是一个优化,但你尝试只对其中一个数组进行排序,并使用二进制搜索来检查另一个数组的元素是否存在。所以现在应该O( n
[复制一个数组作为新数组] + nlogn
[对它进行排序] + mlogn
[二进制搜索第二个元素到已排序的新数组] )
。
HTH
答案 1 :(得分:0)
排序对象可能很昂贵,所以我会尽量避免这种情况。
一种更快的方法可能是使用std :: hash_map为每个数组创建索引,其中字符串为index,数组索引为value。您将获得两个可以一次迭代的容器。较小的迭代器将被提前,直到找到匹配或其他指向较小的值。这将引导您进行可预测的迭代计数。
答案 2 :(得分:0)
可能的解决方案是使用unordered_map
。算法应如下:
Put the first array into the map, using strings as keys and count as values.
For each member in the second array, check it against containment in the map.
If it exists there
Put the record into the new array, combining counts
Remove the record from the map
Else
Put the record into the new array
Iterate throug the remaining recors in the map and put the in to the new array.
该算法的复杂程度约为O(n + m)
答案 3 :(得分:-1)
我觉得不需要排序。您可以使用以下算法。
recordarray1
;放入新阵列recordarray2
中的元素。
如果在新数组中找到元素增量count
。还设置了
recordarray2[N]::count
为负值;这样就不会在第3步中再次检查recordarray2
没有
count设置为负数为新
阵列。如果是负count
遇到然后只需将其更改为
正。注意:如果在同一个数组中有相似的字符串元素,则此算法不会小心。也不要将string
用作变量名。因为它的类型名称为std::string
。