如何在Lua中比较修改后的数组与原始数组?

首先,是一些伪代码:

local array = {
    "a",
    "b",
    "c",
    "d",
    "e",
    "f",
    "g",
}

现在,创建一些数据,用于存储有关原始数组的重要信息。它可以只是复制整个数组,但由于我不知道解决我的问题最快的方法是什么,所以我保留它空白。


local info = createinfo(array)

现在创建一个新版本的该数组,要么使用 table.remove/insert() 进行,要么只是用原始元素创建一个新数组。因此,不要玩弄 table.insert/remove()


local array = {
    "a",
    "b",
    "d",
    "e",
    "f",
    "c",
}

找出发生了什么变化(以下是规范)


local changes = calculatechanges(array, info)

我想找出什么?

  1. 发生了什么元素移动? (例如 "c")
  2. 发生了什么元素删除? (例如 "g")
  3. 我不关心元素移动到哪里。

如果可能的话,如何找到这一点?并且由于我的原始问题具有时间关键性( createchanges()calculatechanges() 都是),最快的方法是什么?

附注:顺便说一下,我正在使用Lua 5.1。

编辑: 作为“变化”,我定义了以下内容: 将原始数组转换为修改后的最小“ move x from index i to j ”数量是什么?

另一个编辑: 我可能正在寻找Levenshtein距离的类似实现。但是,我需要知道必须替换哪些元素,而不仅仅是距离。

点赞
用户7396148
用户7396148

这是一个解决方案,我倒置了数组以便于简化索引查找。然后我使用了一个 while 循环来有选择地增加 a1a2 的索引。

function diff(a1, a2)

  local added = {}
  local moved = {}
  local removed = {}

  local a1IndexOf = {}
  for i, v in ipairs(a1)do
    a1IndexOf[v] = i
  end

  local a2IndexOf = {}
  for i, v in ipairs(a2)do
    a2IndexOf[v] = i
  end

  local index1 = 1
  local index2 = 1
  while(index1 <= #a1) do
    local value1 = a1[index1]
    local value2 = a2[index2]

    if value1 == value2 then
      index1 = index1 + 1
      index2 = index2 + 1

    elseif a2IndexOf[value1] == nil then
      removed[value1] = true
      index1 = index1 + 1

    elseif moved[value1] then
      index1 = index1 + 1

    elseif moved[value2] then
      index2 = index2 + 1

    elseif a1IndexOf[value2] < a2IndexOf[value1] then
      moved[value1] = true
      index1 = index1 + 1
    else
      moved[value2] = true
      index2 = index2 + 1
    end
  end

  print("\nElements Moved:")
  for v in pairs(moved) do
    print("\t" .. v)
  end
  print("\nElements Removed:")
  for v in pairs(removed) do
    print("\t" .. v)
  end
end

一些示例输入和结果:

local array = {
  "a",
  "b",
  "c",
}

local info = {

  "a",
  "c",
  "b",
}
元素迁移:
    c

元素已移除:
local array = {
  "a",
  "b",
  "c",
}

local info = {

  "a",
  "c",

}
元素迁移:

元素已移除:
    b
2020-08-11 21:16:22