【问题标题】:Given a sorted array of n elements, sort a subset n/2 elements in linear time给定一个有 n 个元素的排序数组,在​​线性时间内对子集 n/2 个元素进行排序
【发布时间】:2014-03-10 04:24:39
【问题描述】:

我有一个由 n 个元素组成的排序数组。现在我得到了 n/2 个元素,每个元素都属于已排序的数组。 n/2 个元素是从排序后的数组中随机抽取的。如何在线性时间内对这些 n/2 个元素进行排序?

【问题讨论】:

  • 您是否特别了解这些元素(例如,它们是整数吗?)是否允许重复?
  • 只有非比较排序才能比 O(n lg n) 运行得更好 - 请参阅 RadixCounting 排序以了解“排序索引”(用作排序权重)如何可能有用。
  • @templatetypedef。您在下面的答案是我一直在寻找的。谢谢。正如您在回答中已经解释的那样,重复或不重复并不重要。
  • @user3299864 如果是这样,请将 templatetypedef 答案标记为已接受 :)

标签: arrays algorithm sorting time-complexity


【解决方案1】:

一种方法涉及散列。构建一个包含从数组中提取的所有 n / 2 个元素的哈希集。如果允许重复,则改为从元素到它们的频率构建一个哈希表。按照预期,这将花费 O(n) 时间。

然后,按升序遍历已排序的数组,并检查数组的每个元素是否在哈希集/哈希表中。如果是这样,则将该元素附加到输出数组(并且,如果允许重复,则对集合中元素的每个副本执行一次)。这将花费 O(1) 时间,按照预期,数组的每个元素,因此这一步也需要 O(n) 时间。

因此,总运行时间为 O(n),符合预期。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果元素适合一个数组,你可以使用另一个布尔数组,它标记了哪些元素被选中boolean [] selected

    所以通过遍历这个数组,只打印出被标记为选中的元素,就可以得到想要的效果。

    编辑:通过修饰返回对象,我们甚至可以对这些随机值的子集进行排序

    boolean [] selected;
    Object [] data;// the array of elements
    
    ReturnObject getRandom(){
        int index = random();
        selected[index] = true;
        return new ReturnObject(index,data[index]);
    }
    
    void printSelected(){
    
        for(int i = 0; i < data.length; i++){
            if(selected[i]){
               print(data[i]);
            }
        }
    }
    
    void printSubset(ReturnObject[]set){
        boolean []selected = ....
        for(int i = 0; i < set.length; i++){
            selected[set[i].index] = true;
        }
        for(int i = 0; i < data.length; i++){
            if(selected[i]){
                print(data[i]);
            }
        }
    }
    
    
    class ReturnObject{//Class decorating the return object, which includes its index in the data array
        int index;
        Object data;
    }
    

    【讨论】:

    • 如果数字是由外部来源提供给您的,而不是按照您在此处显示的方式生成,您将如何在 O(n) 时间内填写 selected 数组?
    • @templatetypedef 实际上你可以通过在数组中包含它的索引来装饰返回对象
    • 确实如此。我的印象是问题是“给你一个大小为 n / 2 的子集,它是在你的控制之外创建的。收到集合后,去排序它。”这将阻止您在此处描述的方法。
    • @templatetypedef 编辑代码来说明我的观点,这种方法可以让我们拥有两种不同的功能,一种是打印所有随机值,一种是打印那些随机值的子集,并且还摆脱了hashmap,但是添加另一个类(好坏):)
    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2020-04-22
    • 2010-09-15
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多