每週學算法/讀英文/知識點心得分享 3.11 - 3.15

 每週一個 Algorithm,Review 一篇英文文章,總結一個工作中的技術 Tip,以及 Share 一個傳遞價值觀的東西! 

Algorithm: 學習算法

題目:Merge k Sorted Lists

 

描述:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:

[

    1->4->5,

    1->3->4,

    2->6
]

Output: 1->1->2->3->4->4->5->6

 

解題過程:一種思路是多個指針指向鏈表頭,將表頭元素放入優先隊列 pqueue,每次從中取出一個然後添加到新鏈表的next,並將取出元素的next放入pqueue,直到隊列爲空。另一種思路是分治法,有時間再補上。

 

解法:

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        // define priorityQueue
        PriorityQueue<ListNode> q= new PriorityQueue<ListNode>(lists.size(), new Comparator<ListNode>(){
            @Override
            public int compare(ListNode o1,ListNode o2){
                if (o1.val<o2.val)
                    return -1;
                else if (o1.val==o2.val)
                    return 0;
                else 
                    return 1;
            }
        });

        // pop queue with list head
        for (ListNode head : lists) {
            if (head != null) {
                q.add(head);
            }
        }

        // pop from queue and append node to new list, add next from poll element to queue
        ListNode dummy = new ListNode(0);
        ListNode temp = dummy;
        while (!q.isEmpty()) {
            temp.next = q.poll();
            if (temp.next.next != null) {
                q.add(temp.next.next);
            }
            temp = temp.next;
        }
        return dummy.next;
    }
}

 

Review: 學習英文

題目:Effective Java Item 6 Eliminate obsolete object references

作者分析三個可能的內存泄漏點:對無用對象保持的引用、緩存 和 監聽器及回調方法。

如果你的程序自己在管理內存 ,分配數組或對象空間,計算區分有用和無用數據的下標,例如Vector.java 這個類,那麼就有內存泄露的可能。不僅是存放在數組中的對象,而且被這些對象引用的對象也一概不會被回收,因爲只有程序員知道,而JVM並不知道他們已經廢棄。對於這種情況,作者建議是對廢棄對象作 null 處理。

對於緩存中的內存泄漏,作者建議使用WeakHashMap 作爲緩存,方便JVM在內存不夠時回收。這種解決方法有一個前提,就是你認爲如果存在對於Key的引用,那麼緩存就是有效的,因爲這樣JVM就不回收WeakHashMap中的對象。

對於監聽器的內存泄漏,作者的建議同樣是使用WeakReference來 引用他們,當垃圾回收時就會回收他們。

 

Tips: 知識點

在JDK8中,HashMap有一個比較大的變動,就是當鏈表長度過長時,查詢/插入/刪除的複雜度會退化成O(N),通過將鏈表轉化成一顆紅黑樹,使得複雜度保持在O(LogN)

Share: 價值觀

複雜的事情簡單做,是專家;簡單的事情重複做,是行家;簡單的事情用心做,你會快樂!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章