排列之间的差异

时间:2016-01-27 16:40:00

标签: c++ c algorithm permutation

有没有办法定量计算两个排列之间的距离

假设我们有以下两个元素序列:

$('#msg').html(html);

我可以说排列A = {0, 1, 2, 3} B = {0, 3, 2, 1} B不同,因为:

  • 我需要 1 交换操作才能将A转换为B
  • A中有 2 个元素,其B
  • 中相同元素的索引不同

还有其他方法来比较和描述这两者之间的差异吗?

主要目标是定义一种能够接近第二个排列A到第一个B的算法,这样如果应用此过程的所有步骤,结果将是排列A本身。 但为了达到这个目的,我认为最好先定义一个明智的程序来描述AB的差异。

是否有任何已知的算法允许对另一个进行置换?

2 个答案:

答案 0 :(得分:3)

有几种不同的方法可以定义两个序列之间的差异。仅举几例:

Hamming distance :元素不同的位置数。

levenshtein(A, B)
  replace B[1] with A[1] and replace B[3] with A[3]
=> 2

Levenshtein distance :从一个序列到另一个序列所需的最小修改次数。

damerau_levenshtein(A, B)
  transpose B[3] with B[1]
=> 1

Damerau–Levenshtein distance :前者的扩展,考虑了换位。

//---routing.js----------------------------------
(function () {
    'use strict';
    angular
        .module('appModule')
        .config(['$routeProvider', routing]);

    function routing ($routeProvider) {
        $routeProvider
            .when('/page1', {
            url: "/page1",
            templateUrl: 'views/page1.html',
            controller: 'Page1Ctrl'
        })
            .when('/page2', {
                url: "/page2",
                templateUrl: 'views/page2.html',
                controller: 'Page2Ctrl'
            })
    }
})();

//---menuToggle.js----------------------------------
(function () {
    'use strict';

    angular.module('appModule')
        .factory('TogglerFactory', function($rootScope) {
            var TogglerFactory = {};

            TogglerFactory.menuToggle = function(){
                $rootScope.clicked = !$rootScope.clicked;
            }

            return TogglerFactory;
        });
}());


//---page1Ctrl.js----------------------------------
(function () {
    'use strict';
    angular
        .module('appModule')
        .controller('Page1Ctrl', ['TogglerFactory', page1Ctrl]);

    function page1Ctrl(Toggler) {
        Toggler.menuToggle();
    }
})();

根据您给出的示例,您有兴趣跟踪换位,因此Damerau-Levenshtein距离是您最好的选择。

答案 1 :(得分:1)

排列之间的距离可以是排列的词典索引之间的距离。

如何查找词典索引is described here