我有一个家庭作业,需要在内存中移动一个圆形数组-n。
我使用以下C ++语法完成了任务:
while ( r < 0 ) // rotate negatively.
{
if ( i == top+1 )
{
current->n = items[top+1].n;
items[top+1].n = items[back-1].n;
}
midPtr->n = items[++i].n;
items[i].n = current->n;
if ( i == back-1 )
{
items[back-1].n = current->n;
i = 0;
r++; continue;
}
else
{
current->n = items[++i].n;
items[i].n = midPtr->n;
if ( i == back-1 )
{
i = 0;
r++; continue;
}
}
}
我想知道是否有人有更好,更有效率 用-n单位移动圆形阵列的方法。
因为我似乎在进行不必要的转移 在ptr变量之间。
答案 0 :(得分:10)
不给你代码(这毕竟是家庭作业)考虑这个...... 圆形数组只是内存中n个单元的分配和指向数组“开始”的指针。数组中的第一项不必是分配的内存中的最低地址,而只是数组中表示逻辑第一个元素的项的指针/索引。移动数组只是移动第一个元素的索引。它可以在没有循环的情况下完成,只需计算索引需要移动多远 - 考虑到数据结构的循环性质。
答案 1 :(得分:2)
Finnicky,但是,我想,好的(有太多的地方可能会有一个错误来确保它们全部 - 只要确保你有大量的单元测试;-)。就个人而言,每当遇到这样的问题时(在实际工作环境中 - 唉,家庭作业的时间对我来说已经过去了;-)我倾向于关注我很久以前从Gries学到的东西......:数组内的任何“交换两个块”任务都可以非常有效地执行(线性时间,0个额外内存)和一个基元 - “反转块”。将数组可视化为正常的紧凑内存,假设你有......:
start
.
.
beg1
.
.
end1
.
.
beg2
.
.
end2
.
.
finis
你的任务是将块(beg1..end1)与块交换(beg2..end2)。 Gries解决方案是(在每种情况下都包含一个块(begin..end),其中包含极值):
1. invert (beg1..end2)
2. invert (end2..beg2)
3. invert (end2+1..end1-1)
4. invert (end1..beg1)
......就是这样! - )由于反转(X..Y)采取(Y-X + 1)基本动作,Gries解决方案需要2 *(end2-beg1 + 1)这样的动作 - 相对开销与“最小可能的基本移动”相比,在某些特殊情况下(例如,比最终1大得多,并且两个块的长度完全相同,例如),但是普遍性和缺乏对于离开的一般性和缺乏担忧一个问题对我来说更有价值。
当然,“轮换” 是“交换两个街区”的特例。所以我的直觉是确保我有“反转”原语(无论如何更容易编程;-)然后使用它。
但是,我只需要担心我的代码清晰,正确和快速,而不是担心TA如何评估它,不可否认; - )。