我有两个非常大的NSMutableArray
字符串,每个字符串包含超过40k记录。我必须从一个数组中获取每个元素,然后将该字符串排序到另一个数组中,然后创建一个新数组,该新数组仅包含两个数组中的那些记录。我实现了以下代码,这些代码需要太多时间以及大量内存空间(设备崩溃)。有什么方法可以更有效地解决此问题。
// _perArray and listArray contains more then 30K records each
for(NSString *gak in _perArray){
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF LIKE[c] %@",gak];
NSArray *results = [listArray filteredArrayUsingPredicate:predicate];
if(results.count>0){
[_resultArray addObject:results[0]];
}
}
最佳答案
使用二进制搜索
这是什么意思:
N,M
为其中N<=M
O(N.M)
O(N.log(N).log(M))
对两个数组进行排序并使用单遍增量搜索
O((N.log(N))+(M.log(M))+M)
O(M.log(M))
的所以:
M
循环具有较少记录的数组的
更具体地说,项目符号2将会是这样的(如果数组升序排列):
// variables
string m[M],n[N],o[N]; // your arrays any string type with overloaded <,== operators
int M,N,O; // arrays sizes
int ixm[M],ixn[N]; // indexes for index sort
int i,j;
// bullet 2
for (i=0,j=0,O=0;;)
{
if (m[ixm[i]]==n[ixn[j]]) { o[O]=m[ixm[i]]; O++; }
if (m[ixm[i]]< n[ixn[j]]) { if (i<M) i++; else { if (j<N) j++; else break; }}
else { if (j<N) j++; else { if (i<M) i++; else break; }}
}
如果正确地对字符串比较进行编码,则可以在条件单一的情况下进行比较
[备注]
M.N
字符串比较中的M.N/2
O[]
是否尚未包含添加的字符串O[]
排序或索引排序