【问题标题】:Sorting Algorithm for expensive swapping?昂贵交换的排序算法?
【发布时间】:2019-04-09 22:41:57
【问题描述】:

我正在开发的应用程序中遇到以下问题:

我得到了两个列表:

list1 = { Z, K, A, B, A, C }

list2 = { A, A, B, C, K, Z }

list2 保证是list1 的排序版本。

我的目标是对list1 仅通过交换list1 中的元素 进行排序。例如,我不能遍历list2 并简单地将list1 中的每个元素i 分配给list2 中的每个元素j

使用list2 作为资源,我需要在可能的绝对最小交换次数中对list1 进行排序。

是否有专门用于此目的的算法集?我没听说过这样的事情。

【问题讨论】:

  • @WillemVanOnsem 那将是O(n!),对吗?对于list1 的每个索引,您需要对应该进入该索引的元素执行线性搜索吗?还有比这更好的吗?
  • 不,在搜索中它是 O(n^2),但是如果我们可以制作额外的数据结构等,甚至可以最小化。对于每个项目,我们在尾部执行“线性搜索”。
  • “在[你]正在开发的应用程序中”?你确定这不是作业或编程竞赛的问题吗?在现实世界中,您不会关心 99.9999% 情况下的绝对最小交换次数,您可能只会根据第二个列表中的索引运行正常排序。
  • @Hatefiend 那么你的手上可能有an XY problem

标签: algorithm sorting


【解决方案1】:

我在 java 中编写了这段代码,以便进行最少的交换, 由于第二个列表保证已排序,我们可以查找其中的每个元素并从第一个列表中找到它的索引,然后在当前索引元素和我们找到的元素之间进行交换。

更新:我修改了 findLastElementIndex,因为它会检查交换后的元素是否会在基于 list2 的交换后位于正确的索引中。

public class Testing {

    private static String[] unorderedList = {"Z", "C", "A", "B", "A", "K"};
    private static String[] orderedList = {"A", "A", "B", "C", "K", "Z"};
    private static int numberOfSwaps;

    public static void main(String[] args) {
        for (int i = 0; i < unorderedList.length; i++) {
            if (!unorderedList[i].equals(orderedList[i])) {
                int index = findElementToSwapIndex(i, orderedList[i]);
                swapElements(unorderedList, i, index);
            }
        }
        System.out.println(numberOfSwaps);
    }

    private static void swapElements(String[] list, int indexOfFirstElement, int IndexOfSecElement) {
        String temp = list[indexOfFirstElement];
        list[indexOfFirstElement] = list[IndexOfSecElement];
        list[IndexOfSecElement] = temp;
        numberOfSwaps++;
    }

    private static int findElementToSwapIndex(int currentIndexOfUnorderedList , String letter) {
        int lastElementToSwapIndex = 0;
        for (int i = 0; i < unorderedList.length; i++) {
            if (unorderedList[i].equals(letter)) {
                lastElementToSwapIndex = i;
            if(unorderedList[currentIndexOfUnorderedList].equals(orderedList[lastElementToSwapIndex])){// check if the swapped element will be in the right place in regard to list 2
                    return lastElementToSwapIndex;
                }
            }
        }
        return lastElementToSwapIndex;
    }
}

此代码的最小交换次数与https://stackoverflow.com/a/40507589/6726632 中的相同

希望这可以帮助你。

【讨论】:

  • 这将返回 3 而不是 list1 = {"D", "E", "C", "C"}, list2 = {"C", "C", "D", "E"}; 的 2。链接的帖子不同,因为在这种情况下,只允许使用独特的元素。
  • 你是对的,在我的情况下,如果这封信不是唯一的这种方法,我选择获取最后一次出现的字母,它可能也可能不会得到绝对最小的原因,这取决于你是哪一个交换。
  • @Dukeling 你知道用重复的方法来做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多