【发布时间】:2020-12-01 11:01:11
【问题描述】:
先来一点伪代码:
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)
我想知道什么?
- 什么元素被移动了? (例如
"c") - 删除了哪些元素? (例如
"g") - 我对元素移动到哪里不感兴趣。
如果可能的话,我如何找到它?
什么是最快的方法,因为我最初的问题是时间紧迫的(createchanges() 和 calculatechanges())?
附:顺便说一句,如果这很重要,我正在使用 Lua 5.1。
编辑: 作为“改变”,我定义了以下内容: 将原始数组转换为修改后的“将 x 从索引 i 移动到 j”的最小量是多少?
另一个编辑: 可能我正在寻找 Levenshtein 距离的类似实现。但是,我需要知道,必须替换哪些元素,而不是(仅)距离。
【问题讨论】:
-
c和d已交换。那么,What Element has been moved?是c还是d? -
这实际上是一个好问题。我将编辑我的问题以使其更加精确。我在列表中添加了更多元素,因此很明显,我想要最少的更改。
-
change的定义是什么,如果是索引变化,那么除了c之外,d、e和f也是如此。例如:"a","b","c","d"->"a","c","b","d"你会如何描述这种变化?以及它与"a","c","d","b"有何不同请注意c在这两种情况下都已“移动”。 -
@Nifim 好的,我想我现在明白了,我的问题还不清楚。作为更改,我定义了以下内容:以“将 x 从索引 i 移动到索引 j”为单位的最小移动,以将原始数组转换为修改后的版本。这是否澄清了我的问题?我希望我没有让它变得更加混乱。
-
现在听起来您正在寻找一种计算编辑距离的方法,例如,Levenshtein distance。
标签: arrays algorithm performance lua