每週一個 Algorithm,Review 一篇英文文章,總結一個工做中的技術 Tip,以及 Share 一個傳遞價值觀的東西! java
題目:Merge k Sorted Listsnode
描述:程序員
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.算法
Example:數組
Input:緩存
[app
1->4->5,ide
1->3->4,學習
2->6
]spaOutput: 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; } }
題目:Effective Java Item 6 Eliminate obsolete object references
做者分析三個可能的內存泄漏點:對無用對象保持的引用、緩存 和 監聽器及回調方法。
若是你的程序本身在管理內存 ,分配數組或對象空間,計算區分有用和無用數據的下標,例如Vector.java 這個類,那麼就有內存泄露的可能。不只是存放在數組中的對象,並且被這些對象引用的對象也一律不會被回收,由於只有程序員知道,而JVM並不知道他們已經廢棄。對於這種狀況,做者建議是對廢棄對象做 null 處理。
對於緩存中的內存泄漏,做者建議使用WeakHashMap 做爲緩存,方便JVM在內存不夠時回收。這種解決方法有一個前提,就是你認爲若是存在對於Key的引用,那麼緩存就是有效的,由於這樣JVM就不回收WeakHashMap中的對象。
對於監聽器的內存泄漏,做者的建議一樣是使用WeakReference來 引用他們,當垃圾回收時就會回收他們。
在JDK8中,HashMap有一個比較大的變更,就是當鏈表長度過長時,查詢/插入/刪除的複雜度會退化成O(N),經過將鏈表轉化成一顆紅黑樹,使得複雜度保持在O(LogN)
複雜的事情簡單作,是專家;簡單的事情重複作,是行家;簡單的事情用心作,你會快樂!