一种查找序列排列的算法

时间:2012-11-07 09:54:54

标签: algorithm

我要问一个简单的问题:如何在复杂度最低的数字序列中找到一个(并且只有一个)排列?

假设我们有序列:1 1 2 3 4。然后我们置换2和3,所以我们有:1 1 3 2 4。我如何才能发现2和3已被置换?最糟糕的解决方案是生成所有可能性并将每个可能性与原始置换序列进行比较,但我需要快速的东西......

感谢您的回答。

3 个答案:

答案 0 :(得分:1)

这个问题是你的问题有多种解决方案,没有一些限制,例如顺序找到顺序。

我要看的是首先测试序列中仍然存在相同的值,如果是这样,只需逐步逐步直到找到不匹配,然后找到另一个值的第一次出现的位置并标记作为排列。现在继续搜索下一个修改等等......

如果您只是想知道它改变了多少,我会看看levenshtein算法。该算法的基础甚至可以为您提供您自己的自定义算法所需的内容或激发其他方法。

这很快但不会告诉你哪些项目已经改变。

我所知道的唯一完整解决方案是记录每次更改,以便您可以查看更改历史记录以了解完美答案。

答案 1 :(得分:0)

function findswaps:
    linkedlist old <- store old string in linkedlist
    linkedlist new <- store new string in linkedlist

    compare elements one by one:
        if same
             next iteration until exhausted
        else
             remember old item
             iterate through future `new` elements one by one:
                 if old item is found
                     report its position in new list
                 else
                     error

我的谦卑尝试请纠正我,如果错了,我可以帮助更好。我猜测数据是无序的,所以它不能比线性更快?

答案 2 :(得分:0)

如果原始数组和派生数组之间只有1个交换,你可以在O(n)处尝试这样的数组长度n:

int count = 0;
int[] mismatches;

foreach index in array {
    if original[index] != derived[index] {
        if count == 2 {
            fail
        }
        mismatches[count++] = index;
    }
}

if count == 2 and
   original[mismatches[0]] == derived[mismatches[1]] and
       original[mismatches[1]] == derived[mismatches[0]] {

    succeed
}

fail

请注意,如果在阵列之间没有交换任何内容,则会报告失败。