gpt4 book ai didi

java - 如何在不生成镜像排列的情况下排列整数数组 (Java)

转载 作者:行者123 更新时间:2023-11-30 10:03:55 25 4
gpt4 key购买 nike

我已经写了一个方法来置换 java 中的整数数组。但是我不知道如何防止找到镜像排列。例如,我想要 [1,2,3] 的所有排列。这些将是:

[1,2,3]
[1,3,2]
[3,1,2]

[3,2,1]
[2,3,1]
[2,1,3]

最后三个排列是镜像排列,我根本不想找到它们。这样做的原因是,我正在尝试为旅行商问题实现蛮力解决方案。通过丢弃镜像排列,我可以节省一些时间,因为在哪个方向执行巡视并不重要。旅行的费用是一样的。

我的想法如下:如上例所示,在镜像排列中,2 始终在 1 之前。如果我遍历数组并找到 2 但还没有找到 1,则意味着 1保存在以后的索引中。这意味着我可以停止这种排列。但是我不知道如何执行此检查。此外,我不知道这种方法是否是解决此问题的最佳方法。我如何执行此检查?有更好的方法吗?

public void bruteforce(Graph g) {
int[] elements = new int[g.size()];
int length = g.size();

for(int i = 0; i < elements.length; i++) {
elements[i] = i;
}

permute(elements, length);

}

public void permute(int[] elements, int length) {
if(length == 1) {
for(int i = 0; i < length; i++) {
System.out.println(Arrays.toString(elements));
}
}else {
for(int i = 1; i < length; i++) {
permute(elements, length-1);

if(length % 2 == 1) {
swap(elements, 1, length-1);
}else {
swap(elements, i, length-1);
}
}
}
}

public void swap(int[] elements, int firstElement, int secondElement) {
int tmp = elements[firstElement];
elements[firstElement] = elements[secondElement];
elements[secondElement] = tmp;
}

最佳答案

您可以使用 equals 方法创建一个 DTO 类“Permutation”来比较正常数组和反向数组并将每个排列保存在 Set 中,这样反向数组将匹配重复并被省略

 ...
Set<Permutation> permutations = new HashSet<>();

public void permute(int[] elements, int length) {
if(length == 1) {
for(int i = 0; i < length; i++) {
permutations.add(new Permutation(elements));
}
...

public class Permutation {

private Integer[] elements;

public Permutation(Integer... elements) {
this.elements = elements;
}

@Override
public int hashCode() {
return elements.length;
}

@Override
public boolean equals(Object obj) {

if (this == obj) {
return true;
}

if (obj == null) {
return false;
}

if (getClass() != obj.getClass()) {
return false;
}

Permutation other = (Permutation) obj;
// reversed elements
List<Integer> revCurElements = Arrays.asList(this.elements);
Collections.reverse(revCurElements);

if (Arrays.equals(this.elements, other.elements) || Arrays.equals(revCurElements.toArray(new Integer[1]), other.elements)) {
return true;
}

return false;
}

}

关于java - 如何在不生成镜像排列的情况下排列整数数组 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56155744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com