排列的概念在计算机科学中有许多应用,例如在排序算法的分析和分布式系统的实现中。形式上,排列是从集合到自身的双射。为简单起见,让我们将自己限制在集合[n]上:= {1,2,。 。 。 ,前n个正整数的n个},并用Sn表示[n]上所有排列的集合。通常可以方便地用 n元组(σ(1),σ(2),...,σ(n))。交换置换的两个元素会产生另一个置换。对于i,j∈[n]令Tij:Sn→Sn是交换i和j图像的映射,即,如果σ∈Sn,则τ:= Tij(σ)由τ(i)=如果i 6 = k 6 = j,则σ(j),τ(j)=σ(i)和τ(k)=σ(k)。 例。令σ=(2,4,3,1)。然后T13(σ)=(3,4,2,1)。 现在,考虑只允许与某些对(i,j)进行交换。对于任何d≥0的整数,让
Pd:= {((i,j)∈[n]×[n]:i = j或d≤j − i≤n − d}
假设置换τ为(d,{)-reachable from σ if there are (i1, j1),(i2, j2), . . . ,(i
,j ) ∈ Pd such that the corresponding swaps transform σ to τ , that is, τ = Ti
j`◦···◦Ti2j2◦Ti1j1(σ)。
问题:
证明对于任何一个正整数n,(n,n-1,...,1)的排列是(1,bn / 2c)-从(1,2,... n )。
从σ找出τ是否可达到(d,)-reachable from σ, one may apply bidirected search as follows: First generate all permutations that are (d, b
/ 2c)。接下来生成从τ可到达(d,d` / 2e)的所有排列。最后,如果两个生成的集相交,则报告“是”,否则报告“否”。用伪代码描述算法;特别是,描述如何生成排列集。 (您可以假设给定的参数有效:您无需实现错误处理。)
使用Java编程语言实现上一个任务的算法。显示您的代码。对于所有d = 1,2,,使用您的实现来求解。 。 。 ,4和= 1, 2, . . . , 9, whether (9, 8, . . . , 1) is (d,
)-可从(1、2,...,9)访问。将结果显示为4×9矩阵。
答案 0 :(得分:3)
这实际上是赫尔辛基大学CS硕士课程选择的准备工作。请不要以当前形式对此进行回答。