在一次采访中,我被要求以最优化的方式在索引中插入元素。
我已经尝试过了
/* Make room for new array element by shifting to right */
for(i=size; i>=pos; i--)
{
arr[i] = arr[i-1];
}
arr[pos-1] = num; /* Insert new element at given position and increment size */
size++;
有没有比这更好的方法了?
答案 0 :(得分:0)
您可以进行以下优化:
-将迭代器放在最后一个元素的位置,并从右到左进行迭代,直到到达pos
为止,并且显然保持变量last
,该变量将保留最后遇到的新元素
-在每次迭代中,检查当前元素是否等于last
,如果是,则跳过它,如果否,则将当前元素复制到current_index+1
并将当前元素分配给变量last
-最终将新元素分配给pos
正如我们所看到的,这种方法基于这样的假设,即比较比移位便宜(即,最好不时对每个迭代和移位元素进行比较,而不是将所有元素从pos
移到结束),但我不确定这个假设在什么程度上正确-考虑到移动一个元素将需要两个涉及内存的汇编操作(从内存地址到寄存器再返回到新的内存地址),而一个涉及内存的操作(从内存地址到寄存器)和一个算术运算进行比较
最糟糕的情况是彼此之间没有相等的元素-在这种情况下,我们将在每次迭代时进行比较和移位。