堆操作

65 阅读1分钟

python的堆操作

import heapq
def testHeapq():
    q = [6, 3, 8, 4, 1]
    heapq.heapify(q)       # q = [1, 3, 8, 4, 6]
    heapq.heappush(q,5)    # q = [1, 3, 5, 4, 6, 8]
    heapq.heappush(q,-2)   # q = [-2, 3, 1, 4, 6, 8, 5] 
    heapq.heappop(q)       # -2  q = [1, 3, 5, 4, 6, 8]
    
def heapHeapq():
    dir(heapq)
    # ['heapify', 'heappop', 'heappush', 'heappushpop', 
    #  'heapreplace', 'merge', 'nlargest', 'nsmallest']

java的堆操作

import java.util.PriorityQueue;

public class Test006 {
    class Node implements Comparable<Node> {
        int cnt, time;

        public Node(int cnt, int time) {
            this.cnt = cnt;
            this.time = time;
        }

        @Override
        public int compareTo(Node o) {
            return cnt == o.cnt ? time - o.time : cnt - o.cnt;
        }

        @Override
        public String toString() {
            return "Node{" + "cnt=" + cnt + ", time=" + time + '}';
        }
    }

    public void testPriorityQueue() {
        PriorityQueue<Node> q = new PriorityQueue<>(10);
        Node node = new Node(2, 3);
        q.offer(node);
        node = new Node(3, 3);
        q.offer(node);
        node = new Node(3, 2);
        q.offer(node);
        node = new Node(5, 3);
        q.offer(node);

        Node e = q.poll();
        System.out.println(e);//Node{cnt=2, time=3}

        e = q.peek();
        System.out.println(e);//Node{cnt=3, time=2}
    }

    public static void main(String[] args) {
        Test006 t = new Test006();
        t.testPriorityQueue();
    }
}

关于Comparator: Comparable:java.lang.Comparable理解为内部比较器 Comparator:java.util.Comparator是外部比较器,给Arrays.sort(arrayList, comparator)使用,有静态方法Comparator.naturalOrder()

public class Test006 {
    public void testArray() {
        class Person implements Comparable<Person> {
            String name;
            int age;

            public Person(String name, int age) {
                this.name = name;
                this.age = age;
            }

            @Override
            public int compareTo(Person o) {
                return this.name.compareTo(o.name) != 0 ? this.name.compareTo(o.name) : this.age - o.age;
            }

            @Override
            public String toString() {
                return "Person{" + "name='" + name + ''' + ", age=" + age + '}';
            }
        }
        class PersonComparator implements Comparator<Person> {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.name.compareTo(o2.name) != 0 ? o1.name.compareTo(o2.name) : o1.age - o2.age;
            }
        }
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("bb", 123));
        personList.add(new Person("aa", 123));
        Person[] persons = personList.toArray(new Person[0]);
        System.out.println(Arrays.toString(persons));
        //[Person{name='bb', age=123}, Person{name='aa', age=123}]
        Arrays.sort(persons, new PersonComparator());
        System.out.println(Arrays.toString(persons));
        //[Person{name='aa', age=123}, Person{name='bb', age=123}]
    }
}