求助,数组合并算法问题
struct ITEM
{
int nID;
int nValue;
};
CArray<ITEM, &ITEM> arr;
现在情况是有N个这样的arr,我希望把N个arr合并为一个arrResult,其中nID相同的是累加到arrResult中相对应的项。
我现在处理方法是:(伪代码,arrNi表示第i个arr)
for(int i = 0; i<N; i++)
{
for(int j = 0; j<arrNi.GetSize(); j++)
{
bool bFind = false;
for(int k = 0; k < arrResult.GetSize(); k++)
{
if(arrResult.GetAt(k).nID == arrNi.GetAt(j).nID)
{ bFind = TRUE; arrResult.GetAt(k).nValue += arrNi.GetAt(j).nValue;}
}
if(!bFind){新增一个到arrResult}
}
}
求算法改进。
[解决办法]
先sort然后归并
或者借鉴基数排序,直接遍历几个数组,然后结果写入arr
[解决办法]
如果之前的N个这样的arr的Nid的范围知道的话,可以根据arr的Nid的范围申请arrResult为一个ITEM
数组,然后使其初始化的时候arrResult的下标和Nid建立关系,然后直接用arrResult对nValue进行操作
[解决办法]
要看你数据是什么样的,最理想状态下是连续ID ID中间无间隔值或者间隔值小的话可以申请大小为N的数组然后下标i=nID-min(nID),然后合并的时候只需要遍历N个这样的arr,循环里面的执行语句为arrResult[fun(xx.nID)].nID=xx.nID arrResult[fun(xx.nID)].nValue+=xx.nValue 这样算法复杂度则为O(n)
当然假如数据不连续的话也可以换一种方式实现同样的效果不过执行的时候可能浪费一定的空间
如果数据ID间隔较大而且N值很大的话可以先暂借一个长度为N的数组执行上面的操作,然后将arrResult中nValue的值不为空的元素再组成一个链表或者数组,释放掉原数组,当然两种都是已知范围的。或者用哈希也可以实现,不知道ID范围还是需要sort以下数据的,然后进行插入操作对arrResult赋值