算法--电路布线问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法--电路布线问题
在⼀块电路板的上、下两端分别有n个接线柱。

根据电路设计,要求⽤导线将上端接线柱与下端接线柱相连

如上图所⽰,每个节点有且只连有⼀条线。

在制作电路板时,要求将这n条连线分布到若⼲绝缘层上。

在同⼀层上的连线不相交。

这个问题是要确定将哪些连线安排在第⼀层上,使得该层上有尽可能多的连线(不相交)。

为了解决这个问题,我们可以将问题简化为这样:
设定上接线柱为1,2,3,....,n。

下接线柱是【 1,2,3,....,n】的⼀个排列设为f(i),i的值就是上接线柱的数字,
如上图就是这样的模型:
i 1 2 3 4 5 6 7 8 9 10
f(i) 8,7,4,2,5,1,9,3,10,6
它们⼀⼀对应。

我们还必须得到这样⼀个结论:
对于上接线柱i1<i2<i3<...<ik来说。

它们与下接线柱f(i)的连线之间互不相交的充要条件是:
f(i1)<f(i2)<...<f(ik)。

这个结论是很显然成⽴的。

因为对于i1<i2如果f(i1)>f(i2)则它们⼀定相交(画出图像来看看)
因此,我可以将这个电路布线问题,转化为这样的问题:
已知有⼀个{1,2,3,...,n}的排列,将其拆分为k个⼦排列,并且每个⼦排列都是严格递增的,求⼦排列的最⼤元素个数。

例如:排列 8,7,4,2,5,1,9,3,10,6可以拆分成五个⼦排列{4,5,9,10}{8}{7}{2,3,6}{1} 。

它最⼤的元素个数是4。

排列 1,2,3,4,5,6,7,8,9,10它是递增的,所以⽆需拆分,最⼤元素个数是10。

算法实现:
对于排列8,7,4,2,5,1,9,3,10,6。

先将记录第⼀个值8,依次向后扫描⾄⼤于8的元素。

如果发现8的元素,例如9,则我可以产⽣⼀个⼦排列{8,9}(实际上只需要更改元素数量和最⼤值即可),继续扫描。

产⽣⼦排列{8,9,10}。

扫描完毕后姑且认为⼦排列最⼤元素是3个。

第⼆次以7向后扫描,只要扫描到⽐它⼤的,就将产⽣⼀个⼦排列,继续向后扫描,扫描结束后,得到排列是{7,9,10}。

个数是3,与之前的⽐较。

第三次以4开始扫描,。

依次下去⾄扫描结束。

使⽤递归算法代码简单,算法复杂度为O(N*N)
#include <iostream>
using namespace std;
#define N 10
int sub[N] = { 2, 7, 3, 4, 5, 6, 9, 8, 10, 1 };
int function(int MaxElem,int e=0,int counts=1)
{
if (e==N-1)
{
//递归的出⼝
if (sub[e] > MaxElem) counts++;
return counts;
}
else
{
if (sub[e]>MaxElem)
{
MaxElem = sub[e];
counts++;
}
return function(MaxElem,e+1,counts);
}
}
int main()
{
int max = 0,t;
for (int i = 0; i < N; i++)
{
if ((t = function(sub[i]))>max) max = t;
}
cout << max << endl; return0;
}。

相关文档
最新文档