【问题标题】:Sorting algorithm for continuous data stream连续数据流的排序算法
【发布时间】:2015-03-30 21:32:47
【问题描述】:

堆排序、快速排序和合并排序哪一种排序算法可以处理连续的数据流?我想要一个始终排序的列表,以便新值可以立即在正确的位置进入列表。我似乎找不到始终维护排序列表和拥有连续数据流的细节。

class StreamSorter<A extends Comparable <A>> { 
        // A[] sorted_list;
        // other fields and initialiser: TODO

 public void add_new_element(A x) {

 // add new element to the data received so far and create a sorted list.

  }
 }

如何实现这个类,这样每次调用 add_new_element 时,sorted_list 都会包含目前所有排序好的元素?

对不起,如果这是一个愚蠢的问题,相信我,我已经尽我所能。

干杯

【问题讨论】:

  • 你能澄清一下连续数据流吗?如果这意味着它正在进行中,那么您就无法真正对其进行排序,因为排序算法适用于有限列表。您可以按块对其进行排序,但我认为这不是您要问的。或者,如果您正在接收输入流并保留到目前为止看到的所有内容的列表并进行排序,那么插入排序将是合适的。
  • 与其将排序算法与与顺序无关的数据结构相结合,为什么不寻找一种能够保持其元素排序的数据结构呢?像 TreeBag/TreeMultiset 或类似的。您也可以编写自己的 List 子类,覆盖 add()/insert() 方法并在每次调用后重新排序。
  • 看看PriorityQueue。您可以将对象放入其中,无论何时取出它们,它们总是会按排序顺序出来。
  • 顺便说一句,在 Java 中,方法名称中没有下划线(通常)。惯例是使用驼峰式大小写,如addNewElement,更好的选择是add。

标签: java algorithm sorting continuous


【解决方案1】:

您可以使用TreeSet 来维护排序集,如果需要,可以使用Collections.synchronizedSortedSet() 将其包装在线程安全包装器中。

java.util.SortedSet<E> s = java.util.Collections.synchronizedSortedSet( new java.util.TreeSet<E>( new java.util.Comparator<E>(){
    @Override
    public int compare( final E o1, final E o2 ) {
        // Add sorting criteria.
        return 0;
    }
}));

【讨论】:

    【解决方案2】:

    所以,问题是它实际上并不能正常工作。在任何时候,一个新的最低元素可能会进来,它必须直接从头开始,所以当更多元素还在进来时,你不能开始遍历排序列表。但是堆是 sort 您正在寻找的内容:您可以向其中添加更多元素,并且您可以按照自己的方式完成它,去掉迄今为止您见过的最低元素。

    【讨论】:

      【解决方案3】:

      既然您说I want to have a list that's always sorted,请使用java.util.TreeSet<E> 或java.util.PriorityQueue<E>。 TreeSet 实现了Set 接口,因此不允许重复值。

      请注意,插入的元素必须具有自然顺序,即实现Comparable<T>,或者您必须提供Comparator<T>。

      有关排序数据结构的更多信息,请查看stackoverflow 上的question。

      【讨论】:

        【解决方案4】:

        如果我理解正确 - 您希望您的元素以动态排序顺序存储在内存集合中,而不是在将所有元素添加到集合中时在逻辑点对其进行排序。

        如果这是正确的理解 - 您正在寻找 SortedSet 的实现 - TreeSet 就是示例之一。

        请注意,您的元素需要具有可比性。当然,限制是在内存利用率方面 - 考虑到您正在流式传输,您可能有相对较大的数据负载。

        快速而肮脏的例子,

        package com.mytrial;
        
        import java.util.Set;
        import java.util.TreeSet;
        
        
        public class StreamSorterExample {
        
            private static class MyDataFromStream implements Comparable<MyDataFromStream> {
                int someWeight;
        
                public MyDataFromStream(int someWeight) {
                    this.someWeight = someWeight;
                }
        
                @Override
                public String toString() {
                    return Integer.toString(someWeight);
                }
        
                @Override
                public int compareTo(MyDataFromStream that) {
                    return this.someWeight - that.someWeight;
                }
            };
        
            public static void main(String[] args) {
                Set<MyDataFromStream> streamedData = new TreeSet<MyDataFromStream>();
        
                streamedData.add(new MyDataFromStream(10));
                streamedData.add(new MyDataFromStream(3));
                streamedData.add(new MyDataFromStream(5));
        
                System.out.println(streamedData);
        
                streamedData.add(new MyDataFromStream(111));
                streamedData.add(new MyDataFromStream(-1));
        
                System.out.println(streamedData);
            };
        };
        

        输出

        [3, 5, 10]
        [-1, 3, 5, 10, 111]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-13
          • 1970-01-01
          • 2012-11-04
          • 2023-02-07
          相关资源
          最近更新 更多