1. 程式人生 > >Java開發崗面試中的一些演算法題和思想

Java開發崗面試中的一些演算法題和思想

第一、最小的k個數的解決方案:

方法一:就是利用快速排序的思想,直接找到pivot為k,然後返回前面k個數,時間複雜度為O(n)

方法二:適用於海量資料的處理,建立一個大小為k的容器,每次讀入一個數,若容器不滿,則繼續新增。當容器滿了之後,有三件事要做:在k個整數中找到最大數、二是有可能在容器中刪除這個數、三是有可能要將這個數插入到容器中;時間複雜度是O(nlog2n)

第二、超大資料的排序(使用布隆過濾器(Bloom Filter)進行大資料量排序,也就是位運算在排序與搜尋中的應用)

bit位操作 思考下面的問題: 一個最大的9位整數為999999999 這9億條資料是不重複的,可不可以把這些資料組成一個佇列或陣列,讓它有0~999999999(10億個)元素陣列下標表示數值,節點中用0表示這個數 沒有,1表示有這個數,判斷0或1只用一個bit儲存就夠了

宣告一個可以包含9位整數的bit陣列(10億),一共需要10億/8=120M記憶體,把記憶體中的資料全部初始化為0 ,讀取檔案中的資料,並將資料放入記憶體。比如讀到一個數據為341245909這個資料,那就先在記憶體中找到341245909這個bit,並將bit值 置為1 ,遍歷整個bit陣列,將bit為1的陣列下標存入檔案

http://my.oschina.net/bairrfhoinn/blog/209965