Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 排列数对,使相邻数对的成员相等_Algorithm_Sorting - Fatal编程技术网

Algorithm 排列数对,使相邻数对的成员相等

Algorithm 排列数对,使相邻数对的成员相等,algorithm,sorting,Algorithm,Sorting,我想安排以下项目,形成可能的最长链,从12-8开始,并端到端匹配数字 我的项目是7-4、11-8、11-11、1-0、4-2、7-5、10-8、7-3、10-5、7-2、9-8、12-8、0-0、11-10 最长的可能链是12-8、8-11、11-11、11-10、10-5、5-7、7-4、4-2、2-7、7-3 我尝试在项目数组上迭代,并获取与我要查找的数字匹配的第一个值,但它不会产生最长的链。我的方法让我明白:12-8,8-11,11-11,11-10,10-8,8-9 如何为此任务编写适当

我想安排以下项目,形成可能的最长链,从12-8开始,并端到端匹配数字

我的项目是7-4、11-8、11-11、1-0、4-2、7-5、10-8、7-3、10-5、7-2、9-8、12-8、0-0、11-10

最长的可能链是12-8、8-11、11-11、11-10、10-5、5-7、7-4、4-2、2-7、7-3

我尝试在项目数组上迭代,并获取与我要查找的数字匹配的第一个值,但它不会产生最长的链。我的方法让我明白:12-8,8-11,11-11,11-10,10-8,8-9


如何为此任务编写适当的排序算法?

您需要递归,但它可能无法在更大的数据集上工作: 像这样的

免责声明:这可能不是最优化的解决方案(复杂性O(N!)),但如果允许使用递归,那么实现起来非常简单

(这不是objective-c代码,这是一个算法,请自己翻译,对不起,我不知道objective-c)


此功能将测试从12-8开始的每个图案,并根据问题的大小比较它们的大小(
n
tile数)。您可以选择以下方法之一:

1-Bruteforce:您可以使用回溯检查所有可能的磁贴配置,这将导致算法的复杂性
O(n!)


2-:您可以在bitmask的帮助下使用动态编程来减少搜索空间。这种方法将产生算法
O(2^n*n)

我从图论的角度研究了这个问题,它给出了一些关于这个问题的见解,并提供了一些可以有效解决这个问题的启发式方法

首先,构造一个图,使您得到的每个项目都对应于图的一条边。例如,如果您的输入为:1-2,2-3;构建一个包含节点的图:1、2、3;和边(1,2)、(2,3)

此后,您可以看到您的问题与查找最长的轨迹相同,即,最长的路径不包含任何多条边。不幸的是,正如本文所讨论的,这个问题被认为是NP难问题。因此,我们不能指望找到一个多项式算法来解决这个问题

不过,这个问题其实很类似于教育的问题。但是,在欧拉路径中,您将遍历所有边。它有一个非常简单的解决方案:

无向图具有欧拉路径当且仅当恰好为零 或者两个顶点具有奇数阶,如果其所有顶点都具有奇数阶 非零度属于单个连接组件

因此,为了解决您的问题,您需要图中包含您想要开始的项的连接组件。您可能无法访问不在此连接组件中的项目。因此,您可以忽略图形的所有剩余边

然后,只需计算每个节点的度数,并根据前面的定义检查该图是否具有欧拉路径。如果有,那你就幸运了。因为你不可能拥有比这条路径更长的链

你可以很容易地计算出这个链

但是,如果此组件没有Eularian路径,则您至少知道不存在此组件边缘大小或更大的链

告诉我们:

每个无向图都有偶数个奇数度的顶点

如果不存在欧拉路径,那么我们知道有2k个节点,其中k>1,具有奇数度。所以我们需要去掉最小数量的边,这样我们就有了k=1。但是,需要考虑的是,删除某些边时,可能无法连接其余边


所以我想到的最好的启发是找到边,这样它的两个顶点都有奇数度,移除它不会撕裂连接的组件。如果我们能找到这样的k-1顶点,那么当我们移除它们时,我们仍然会有一个连接的组件,我们将只有两个奇数度的顶点。因此,我们可以很容易地找到最长的链,同样通过使用Fleury算法找到欧拉路径

将数字视为图的顶点,将对视为图的边(因此可能存在多条边)。现在,您的问题归结为在图中查找可能重复顶点(而不是边)的最长路径。

根据errorist的想法,我们可以将图的状态定义为边数、奇数度顶点数、顶点散列及其连接以及奇数度顶点的边集。我们可以通过边的数量减去
min(2,奇数阶顶点的数量)
或如果奇数阶顶点的数量等于2,则通过零对状态进行优先级排序

下面是一个JavaScript实现的尝试,利用堆作为优先级队列。依次删除每个具有奇数阶顶点的边,分析图形并将其拆分为任何单独的组件(如果适用),然后将每个组件推送到优先级队列。循环很早就退出了,希望能够保证返回的第一个带有欧拉路径的图也具有可实现的最长路径

var Heap=function(f){
this.heap=[];
this.isPriority=f | |函数(a,b){返回a>b;};
}
Heap.prototype.put=函数(val){
this.heap.push(val);
var i=this.heap.length-1,
父项=i-1>>1;
而(i!==0&&this.isPriority(this.heap[i],this.heap[parent])){
this.heap[i]=this.heap[parent];
this.heap[parent]=val;
i=父母;
父项=i-1>>1
  }
返回这个.heap;
}
Heap.prototype.get=函数(val){
if(this.heap.length==0){
返回null;
}else if(this.heap.length==1){
返回这个.heap.pop();
}
var first=this.heap[0],
last=this.heap.pop(),
    
list function sortTupleList(list a, list b) //b is the current list
  list biggest = newlist()
  int target = b.last()[1]
  for(tuple k in a)
    if (k[0] == target)
      list n = sortTupleList(a.remove(k), b.add(k))
      if(n.size > biggest.size())
        biggest = n
      end if
    end if
  end for
  if (biggest == emptylist)
    return b
  else
    return biggest
end function


list function caller(list a)
  list b = newlist()
  b.add(12-8)
  a.remove(12-8)
  return sortTupleList(a,b)
end function