Rolling median algorithm in C

前端 未结 13 1732
臣服心动
臣服心动 2020-11-27 09:24

I am currently working on an algorithm to implement a rolling median filter (analogous to a rolling mean filter) in C. From my search of the literature, there appear to be t

13条回答
  •  眼角桃花
    2020-11-27 10:01

    Here is the java implementation

    package MedianOfIntegerStream;
    
    import java.util.Comparator;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.TreeSet;
    
    
    public class MedianOfIntegerStream {
    
        public Set rightMinSet;
        public Set leftMaxSet;
        public int numOfElements;
    
        public MedianOfIntegerStream() {
            rightMinSet = new TreeSet();
            leftMaxSet = new TreeSet(new DescendingComparator());
            numOfElements = 0;
        }
    
        public void addNumberToStream(Integer num) {
            leftMaxSet.add(num);
    
            Iterator iterMax = leftMaxSet.iterator();
            Iterator iterMin = rightMinSet.iterator();
            int maxEl = iterMax.next();
            int minEl = 0;
            if (iterMin.hasNext()) {
                minEl = iterMin.next();
            }
    
            if (numOfElements % 2 == 0) {
                if (numOfElements == 0) {
                    numOfElements++;
                    return;
                } else if (maxEl > minEl) {
                    iterMax.remove();
    
                    if (minEl != 0) {
                        iterMin.remove();
                    }
                    leftMaxSet.add(minEl);
                    rightMinSet.add(maxEl);
                }
            } else {
    
                if (maxEl != 0) {
                    iterMax.remove();
                }
    
                rightMinSet.add(maxEl);
            }
            numOfElements++;
        }
    
        public Double getMedian() {
            if (numOfElements % 2 != 0)
                return new Double(leftMaxSet.iterator().next());
            else
                return (leftMaxSet.iterator().next() + rightMinSet.iterator().next()) / 2.0;
        }
    
        private class DescendingComparator implements Comparator {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        }
    
        public static void main(String[] args) {
            MedianOfIntegerStream streamMedian = new MedianOfIntegerStream();
    
            streamMedian.addNumberToStream(1);
            System.out.println(streamMedian.getMedian()); // should be 1
    
            streamMedian.addNumberToStream(5);
            streamMedian.addNumberToStream(10);
            streamMedian.addNumberToStream(12);
            streamMedian.addNumberToStream(2);
            System.out.println(streamMedian.getMedian()); // should be 5
    
            streamMedian.addNumberToStream(3);
            streamMedian.addNumberToStream(8);
            streamMedian.addNumberToStream(9);
            System.out.println(streamMedian.getMedian()); // should be 6.5
        }
    }
    

提交回复
热议问题