java 大數(shù)據(jù) 一道java面試題,20億數(shù)字的文本排序,如何取前100?
一道java面試題,20億數(shù)字的文本排序,如何取前100?因為這是一個Java問題,所以這是典型的TOPK問題。首先取前100個數(shù)字構(gòu)建一個最小堆,然后依次從堆的頂部插入剩余的數(shù)字,同時調(diào)整堆。堆中最
一道java面試題,20億數(shù)字的文本排序,如何取前100?
因為這是一個Java問題,所以這是典型的TOPK問題。首先取前100個數(shù)字構(gòu)建一個最小堆,然后依次從堆的頂部插入剩余的數(shù)字,同時調(diào)整堆。堆中最后100個元素就是結(jié)果??臻g復(fù)雜度是k,時間復(fù)雜度是nlogk
我已經(jīng)花了60萬。我已經(jīng)工作了10年,但我還是不打印乘法表。在jdk8中,BigInteger的乘法根據(jù)兩個乘法器的大小采用三種算法。
1. 當(dāng)兩個乘法器的(32x80)冪小于2時,使用雙環(huán)直接乘法;
2。否則,當(dāng)兩個乘法器都小于2的(32x240)次方時,將使用Karatsuba算法;
3。另外,采用toom-cook乘法算法。
java能寫乘法表什么水平?
大數(shù)乘法基本上就是乘法垂直計算的編碼。
有三個基本功能
1。大數(shù)的數(shù)組表示。
2. 將大的數(shù)字乘以小數(shù)得到大的數(shù)字。
3. 大數(shù)字,大數(shù)字,大數(shù)字。
對于1,意味著int數(shù)組的每個元素都存儲若干位。例如,每個元素包含四個十進制數(shù)字。[0]商店數(shù)萬,[1]商店數(shù)萬、數(shù)十萬、百萬、千萬,依此類推。一個數(shù)組包含一個很大的數(shù)。因此需要一個額外的int變量來記錄當(dāng)前數(shù)組中使用了多少元素(類似于字符串長度)。
對于2,“decimal”是指可以用int保存的數(shù)字。請注意,只有四個二進制位(與1中提到的數(shù)字一致)。
例如,對于數(shù)字123456789,[0]保存6789,[1]保存2345,[2]保存1。長度3。
這個大數(shù)乘以一個十進制數(shù),如9999,其過程是[0]*9999,即6789*9999=67883211。乘積的下四位( 000)3211保存到乘積的[0](大數(shù)),6788的進位保留到[1]。
那么2345*9999=?23447655,加上剛才結(jié)轉(zhuǎn)的6788,得到2345443,其中4443保存在產(chǎn)品的[1]中(大數(shù)),2345結(jié)轉(zhuǎn)到[2]。
等等。
對于3,基本上只是一個For,添加位,然后注意進位。
將一個大數(shù)乘以一個大數(shù)意味著將第一個大數(shù)乘以第二個大數(shù)的[0](大數(shù)乘以小數(shù)點后,上面的2)得到一個大數(shù)A0;然后將第一個大數(shù)乘以第二個大數(shù)的[1],得到一個大數(shù)A1,最后是A0,A1相加(即大數(shù)相加,3以上)。添加時,請注意A1的[0]應(yīng)與A0的[1]對齊,A2的[0]應(yīng)與A1的[1]和A0的[2]對齊這與我們的垂直計算相同。
PS:以上算法基本上是“萬位小數(shù)”的計算方法。如果數(shù)組的每個元素只包含一個十進制位,那么它就是一個十進制數(shù)。我們使用10000系統(tǒng)的原因是程序員感覺更好。最有效的用法是將每個int保存到2的15次方,即32768。需要注意的是,如果采用十進制進行計算,程序的計算時間將是10000系統(tǒng)的16倍,即效率為1/16。
PS2:使用int數(shù)組時,位數(shù)最多只能為4。因為5位數(shù)相乘可能得到11位數(shù),這超出了int的范圍。