Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Arrays 通过删除最小数量的元素,将给定的整数数组转换为已排序的整数数组_Arrays_Algorithm_Sorting - Fatal编程技术网

Arrays 通过删除最小数量的元素,将给定的整数数组转换为已排序的整数数组

Arrays 通过删除最小数量的元素,将给定的整数数组转换为已排序的整数数组,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,我正在处理以下问题: 我必须通过删除最小数量的元素,将给定的整数数组转换为排序的整数数组 例如:[3,5,2,10,11]将通过删除“2”进行排序:[3,5,10,11]。 或者[3,6,2,4,5,7,7]将通过删除'3','6':[2,4,5,7,7]或删除'6','2':[3,4,5,7,7]进行排序(两种方式我都删除了2个元素,这就是为什么它们都是正确的) 我的想法是为每个元素保留一个计数器,以查看它与其他元素有多少冲突。 我所指的冲突:在第一个示例中,数字“3”和“5”各有一个冲突(与

我正在处理以下问题:

我必须通过删除最小数量的元素,将给定的整数数组转换为排序的整数数组

例如:[3,5,2,10,11]将通过删除“2”进行排序:[3,5,10,11]。 或者[3,6,2,4,5,7,7]将通过删除'3','6':[2,4,5,7,7]或删除'6','2':[3,4,5,7,7]进行排序(两种方式我都删除了2个元素,这就是为什么它们都是正确的)

我的想法是为每个元素保留一个计数器,以查看它与其他元素有多少冲突。 我所指的冲突:在第一个示例中,数字“3”和“5”各有一个冲突(与数字“2”)而数字“2”有两个冲突(与数字“3”和“5”)。 因此,在计算了冲突数组之后,我从原始数组中删除了冲突数最大的元素,并对其余数组重复此操作,直到所有元素都有0个冲突


但是,这不是一种有效的方法(在某些情况下,我没有想到它也会产生错误的结果),因此我想知道是否有人能想出更好的解决方案。

您可以基于数组中的元素构建DAG:

  • 每个元素a[n]都是一个顶点

  • 对于其中(m
    /**
     *  sortedArray : an array already sorted.
     *  leftToSort : an unsorted array that need to be sorted/merged with sortedArray.
     *  first call to this function must be sortArrayByRemoval([], arrayToSort);
    **/
    public Integer[] sortArrayByRemoval(Integer[] sortedArray, Integer[] leftToSort){
        if(leftToSort.size==0){ 
            return sortedArray; //end of recursion
        }
        Integer candidate = leftToSort[0]; 
        if(candidate>=sortedArray[last]){ //append candidate to the sorted array
            return sortArrayByRemoval(sortedArray.append(candidate) , leftToSort.removeFirst());
        }else{
            //either we skip it
            Integer[] result1 = sortArrayByRemoval(sortedArray,leftToSort.removeFirst());
            //either we do back tracking
            Integer[] result2 = sortArrayByRemoval(sortedArray.removeLast(),leftToSort);
            //and finally we return the best choice (i.e. the longest array)
            return biggestArray(result1, result2);
        }
    }
    

    也许不是最有效的,但我认为它给出了正确的答案。

    我相信这只是的巧妙伪装版本。如果删除最小数量的元素以获得排序序列,那么剩下的就是原始数组中最长的递增子序列罗恩:

  • 找到最长的递增子序列(该序列存在O(n logn)算法),然后
  • 删除不在该子序列中的所有内容

  • 希望这能有所帮助!

    如果你不想从原始数组中删除东西,那么你想要的是原始数字序列的最长递增子序列。这是一个众所周知的经典问题,你可以在文献或教科书中找到许多例子


    (如果你一直在删除,那么……找到LCS并删除LCS以外的所有内容。)

    这听起来像是一个编程竞争问题。是吗?不,不是(甚至不知道你的意思)。这是我和我的团队在college.NP的一个项目的一小部分,我不想以任何方式冒犯他人,只是想了解更多动机方面的信息,因为这可能会影响可能的答案(例如,更多/更少的教育性或更多/更少的实用性)没关系,没有冒犯的意思。我想我在寻找一个实用的答案,因为它是关于一个编程项目的(我使用的工具并不重要,最让我困扰的是想法/算法)。这当然会起作用,但请注意,总时间是O(n^2),因为DAG中的最长路径在边数上是线性的,并且有O(n^2)其中的一个。这在O(n^2)时间内可以正常工作,但我认为可以在O(n log n)中解决此问题。@templatetypedef:我不确定它是O(n^2)考虑到我的优化。无论如何,你的解决方案更有效。这是一个很酷的优化!但是,我认为如果你让数组在比其他元素大和小的元素之间交替,这仍然会产生O(n^2)链接,尽管常数因子较低。@templatetypedef:谢谢,我同意。忍者被@templatetypedef打败了