arrays - 在数组中的特定索引处插入元素

标签 arrays algorithm sorting optimization

我在面试中被要求以最优化的方式在索引处插入一个元素(给出了索引)。

我已经试过了

  /* 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++;

还有比这更好的方法吗?

最佳答案

可以做如下优化:

-将迭代器放在最后一个元素的位置并从右到左迭代直到到达 pos显然维护变量 last它保留了最后一个新遇到的元素
- 在每次迭代中,检查当前元素是否等于 last , 如果是则跳过它,如果不是则将当前元素复制到 current_index+1并将当前元素分配给变量 last
- 最后将新元素分配给pos

正如我们所看到的,这种方法基于比较比移位成本更低的假设(即,最好在每次迭代中进行比较并时不时地移位元素,而不是将所有元素从 pos 移动到结束)但我不太确定这个假设在多大程度上是正确的 - 考虑到移动一个元素需要两个涉及内存的汇编操作(从内存地址到寄存器并返回到新的内存地址)与一个涉及内存的操作(从内存地址到寄存器)和一个用于比较的算术运算

最坏的情况是没有相等的元素彼此相邻 - 在这种情况下,我们将在每次迭代中同时进行比较和移位。

关于arrays - 在数组中的特定索引处插入元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56981056/

相关文章:

c - 将用户输入存储到数组中

javascript - 具有类别的项目数组到具有项目的类别

java - 如何将两个用空格分隔的数字放入两个不同的数组中

java - 用最少的迭代次数求均值

algorithm - 如何在不直接乘以数字的情况下计算 2^32?

node.js - 如何使用apollo服务器对graphQl中的数据进行排序?

javascript - 根据匹配的 ID 合并两个数组中的项目

java - 将数组向左移动 4 个单元格

algorithm - CRC除数计算

algorithm - 智能设计排序真的不需要额外的内存吗?