确定数组中的更改方向

时间:2014-04-23 22:29:13

标签: javascript algorithm sorting

给定排序数组,例如。 [1,2,3,4,5]和此数组的变体,其中一个项目被移动到不同的位置(因此不再排序),例如。 [1,2,5,3,4][2,3,4,1,5]我需要可靠地确定"方向"移动 - 向左或向右取决于一个元素移动的方式

5在第一个示例中被移动left1在第二个示例中被移动right

目前我有一个解决方案(从左侧)走过数组并比较它们在索引i的值 - 一旦它们不相同(以确定差异点),它就会比较i+1处的值。如果old[i+1] > new[i+1] then left, otherwise right

//pseudocode:
function(old, now) {
  for(var i in old) {
    if (old[i] !== now[i]) {
      return old[i+1] > now[i+1] ? "left" : "right"
    }
  }
}

修改
是否有更可靠(可能更有效)的解决方案?目前它给出了误报"在某些情况下。我们事件需要第一个数组吗?它总是排序和顺序。

2 个答案:

答案 0 :(得分:1)

您的解决方案确实没有任何改进空间 - 您无法找到解决问题的方法,而无需通过数组的所有成员并针对其他阵列中的成员进行检查。

您当前的时间复杂度是 O(n),实际上并不算太差。因此,您不必担心此功能,如果您的应用程序工作太慢,您应该寻找其他领域来改进。

答案 1 :(得分:0)

不是真正的答案,更多关于算法的讨论。

如果您希望保证从0开始的迭代并忽略继承的可枚举属性,请将 for..in 替换为 for while 或< em>做循环。

给定索引0的迭代,你所拥有的算法不起作用。例如在下面:

var old = [1,2,3];
var now = [2,1,3];

值1已向右移动。该算法将在索引0处找到未匹配,然后比较索引1处的值。old[1]大于now[1],因此返回“left”。

也无法确定某些动作的方向,例如:在上面是1向右移动还是2向左移动?另一个例子:

var old = [1,2,3,4,5];
var new = [1,2,3,5,4];

4向右移动还是5向左移动?需要一个规则来确定哪个需要预先确定。