成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

java - 算法問題,2個(gè)數(shù)組,數(shù)組a保存1000W條手機(jī)號(hào),數(shù)組b保存5000W條,找出兩個(gè)數(shù)組相同的手機(jī)號(hào),執(zhí)行時(shí)間需要 <2s

瀏覽:166日期:2024-01-17 18:49:46

問題描述

有人說用歸并算法,但是執(zhí)行下來時(shí)間遠(yuǎn)遠(yuǎn)不止2s。在下實(shí)在想不出還有什么好辦法,希望各位能給個(gè)提示或者解法,謝謝。

下面是我的測(cè)試代碼:

public class TestA { public static void main(String[] args) {long[] a = new long[50000000];long num = 13000000000l;for (int i = 0; i < a.length; i++) { a[i] = (num + i);}long[] b = new long[10000000];long num2 = 14000000000l;for (int i = 0; i < b.length - 2; i++) { b[i] = (num2 + i);}b[9999999] = 13000000000l;b[9999998] = 13000000001l;long[] c = new long[a.length+b.length];long start = System.currentTimeMillis();for (int i = 0; i < a.length; i++) { c[i] = a[i];}for (int i = 0; i < b.length; i++) { c[i + a.length] = b[i];}System.out.println('start');sort(c, 0, c.length-1);long end = System.nanoTime();System.out.println(System.currentTimeMillis() - start);for (int i = 0; i < c.length; i++) {System.out.println(c[i]);} } public static void sort(long[] data, int left, int right) {if (left < right) { // 找出中間索引 int center = (left + right) / 2; // 對(duì)左邊數(shù)組進(jìn)行遞歸 sort(data, left, center); // 對(duì)右邊數(shù)組進(jìn)行遞歸 sort(data, center + 1, right); // 合并 merge(data, left, center, right);} } public static void merge(long[] data, int left, int center, int right) {long[] tmpArr = new long[data.length];int mid = center + 1;// third記錄中間數(shù)組的索引int third = left;int tmp = left;while (left <= center && mid <= right) { // 從兩個(gè)數(shù)組中取出最小的放入中間數(shù)組 if (data[left] <= data[mid]) {if(data[left] == data[mid]){ System.out.println(data[left]);}tmpArr[third++] = data[left++]; } else {tmpArr[third++] = data[mid++]; }}// 剩余部分依次放入中間數(shù)組while (mid <= right) { tmpArr[third++] = data[mid++];}while (left <= center) { tmpArr[third++] = data[left++];}// 將中間數(shù)組中的內(nèi)容復(fù)制回原數(shù)組while (tmp <= right) { data[tmp] = tmpArr[tmp++];} }}

問題解答

回答1:

提供一個(gè)思路,我們要找的是兩個(gè)數(shù)組里相同的電話號(hào)碼。那么我們把第一個(gè)數(shù)組的電話號(hào)碼建立一顆 字典樹。在第二個(gè)的時(shí)候直接在 字典樹 里查找即可。總體是一個(gè) O(N * 11) = O(N) 的復(fù)雜度。每個(gè)電話號(hào)碼 11 位的話。總的只是一個(gè) O(N) 的復(fù)雜度。參考知乎:https://zhuanlan.zhihu.com/p/...

public class TrieTree { private class Node {char ch;TreeMap<Character, Node> node;int count;public Node(char ch) { ch = this.ch; node = new TreeMap<>(); count = 0;} } public class StringCount implements Comparable{public String str;public int count;public StringCount(String str, int count) { this.str = str; this.count = count;}@Overridepublic int compareTo(Object o) { StringCount t = (StringCount) o; if(this.count > t.count){return -1; } if(this.count < t.count){return 1; } return 0;} } private int indexStringCount; private StringCount[] stringCounts; private Node root; private int size; private static boolean DEBUG = true;public TrieTree() {root = new Node(’$’);size = 0; } public int insert(String str) {int res = 0;Node temp = root;for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); if (temp.node.get(ch) == null) temp.node.put(ch, new Node(ch)); temp = temp.node.get(ch);}if(temp.count == 0) size ++;res = ++temp.count;return res; }public StringCount[] getStringCount(){indexStringCount = 0;stringCounts = new StringCount[this.size];ergodic(root, '');Arrays.sort(stringCounts);{ for(StringCount s : stringCounts){System.out.println(s.str + ' ' + s.count); }}return stringCounts; } private void ergodic(Node foo, String str){if(foo.count != 0){ stringCounts[indexStringCount ++] = new StringCount(str, foo.count);}for(Character ch:foo.node.keySet()){ ergodic(foo.node.get(ch), str + ch);} }private void show(Node foo, String str) {if (foo.count != 0) { System.out.println(str + ' : ' + foo.count);}for(Character ch:foo.node.keySet()){ show(foo.node.get(ch), str + ch);} } public void showALL() {show(root, ''); } public int size(){return size; }public static void main(String[] args) {TrieTree tree = new TrieTree();String[] strs = { 'a', 'aa', 'a', 'b', 'aab', 'bba' };for (int i = 0; i < strs.length; i++) { tree.insert(strs[i]);}tree.showALL();System.out.println(tree.size);tree.getStringCount(); }}回答2:

剛剛找到一種方法,執(zhí)行時(shí)間大概在2s左右:

public class TestB { static long count; public static void main(String[] args) {long[] a = new long[50000000];long num = 13000000000l;for (int i = 0; i < a.length; i++) { a[i] = num + i;}long[] b = new long[10000000];long num2 = 14000000000l;for (int i = 0; i < b.length - 3; i++) { b[i] = num2 + i;}b[9999999] = 13000000000l;b[9999998] = 13000000002l;b[9999997] = 13000000002l;long start = System.currentTimeMillis(); Arrays.sort(a);int flag = -1;for (int i = 0; i < b.length; i++) { count = b[i]; flag = Arrays.binarySearch(a, count); if (flag <= 50000000 && flag >= 0) {System.out.println(count + ' ' +flag); }}System.out.println(System.currentTimeMillis() - start); }}

這個(gè)方法主要思想是先排序,再使用 Arrays.binarySearch()方法進(jìn)行二分法查詢,返回匹配的數(shù)組下標(biāo)。

修改了一下獲取數(shù)據(jù)源的方法,發(fā)現(xiàn)如果使用隨機(jī)數(shù)據(jù)源,耗費(fèi)的時(shí)間是8s左右,誤差時(shí)間主要消耗在sort()排序方法上,數(shù)據(jù)源的規(guī)律還是影響排序算法的時(shí)間復(fù)雜度的。代碼修改如下:

public class TestB {

static long count;public static void main(String[] args) { System.out.println(random()); long[] a = new long[50000000]; for (int i = 0; i < a.length; i++) {a[i] = random(); } long[] b = new long[10000000]; for (int i = 0; i < b.length; i++) {b[i] = random(); } long start = System.currentTimeMillis(); Arrays.sort(b); Arrays.sort(a); int flag = -1; int cc =0; for (int i = 0; i < b.length; i++) {count = b[i];flag = Arrays.binarySearch(a, count);if (flag <= 50000000 && flag >= 0) { System.out.println(count + ' ' + flag); cc++;} } System.out.println('相同數(shù)據(jù)的數(shù)量:'+cc); System.out.println(System.currentTimeMillis() - start);}public static long random() { return Math.round((new Random()).nextDouble()*10000000000L+10000000000L);}

}

回答3:

考慮bitmap, 參考https://github.com/RoaringBit...RoaringBitmap aBM = new RoaringBitmap()for (int i = 0; i < a.length; i++) {

aBM.add(a[i])

}...RoaringBitmap interactionBM = RoaringBitmap.and(aBM, bBM)for (int item: interactionBM) {

System.out.println(item)

}

回答4:

long start = System.currentTimeMillis();HashSet<Long> alongs = new HashSet<>();for (long l : b) { alongs.add(l);}ArrayList<Long> sames = new ArrayList<>();for (long l : a) { if (alongs.contains(l)) {sames.add(l); }}long end = System.currentTimeMillis();System.out.println(end - start);

使用上述代碼,在我的機(jī)器上,是8s

回答5:

http://tieba.baidu.com/p/3866...

回答6:

C#, 本地運(yùn)行,release,611ms

long[] a = new long[50000000];long num = 13000000000L;for (int i = 0; i < a.Length; i++){ a[i] = (num + i);}long[] b = new long[10000000];long num2 = 14000000000L;for (int i = 0; i < b.Length - 2; i++){ b[i] = (num2 + i);}b[9999999] = 13000000000L;b[9999998] = 13000000001L;var hashSetB = new HashSet<long>(b);var matches = new List<long>();var timer = new System.Diagnostics.Stopwatch();Console.WriteLine('Starts...');timer.Start();for (var i = 0; i < a.Length; i++){ if (hashSetB.Contains(a[i])) {matches.Add(a[i]); }}timer.Stop();Console.WriteLine(timer.ElapsedMilliseconds);Console.WriteLine('Found match: ' + string.Join(', ', matches));Console.ReadLine();回答7:

redis SINTER(返回一個(gè)集合的全部成員,該集合是所有給定集合的交集。)

回答8:

如果說這個(gè)操作只能在數(shù)組中進(jìn)行的話,沒什么取巧的辦法,至少要遍歷較小的那個(gè)數(shù)組,甚至排序都是免不了的。而如果可以將數(shù)組內(nèi)容導(dǎo)出到其他數(shù)據(jù)結(jié)構(gòu)的話,又貌似有違題目初衷的嫌疑。出題者是不是想考驗(yàn)數(shù)組操作呢?

回答9:

來一種更簡(jiǎn)單的方法,在MBP上只要200ms左右。普通的Pentium G2020也只要250ms額,這種算法完全不行,回答10:

這題目其實(shí)算法是關(guān)鍵。建議大家看一下編程珠璣的第一章。會(huì)提供很好的思路。首先問題必須細(xì)化一下,就是手機(jī)號(hào)必須只有中國(guó)的手機(jī)號(hào)嗎。否則數(shù)量會(huì)多很多。我簡(jiǎn)單說一下編程珠璣里是怎樣存儲(chǔ)電話號(hào)碼的。他是只使用一個(gè)二進(jìn)制的數(shù)字來存儲(chǔ)所有的手機(jī)號(hào)碼。一個(gè)二進(jìn)制的數(shù)位可以很長(zhǎng)很長(zhǎng)。長(zhǎng)度就等于最大的可能的那個(gè)電話號(hào)碼。比如說13999999999,其實(shí)13可以省掉,我們的這個(gè)數(shù)字就是999999999位的一個(gè)二進(jìn)制數(shù)。在每一位上,如果有這個(gè)電話號(hào)碼,就標(biāo)記為1,如果沒有就標(biāo)記為0.為了簡(jiǎn)單起見,我就假設(shè)手機(jī)號(hào)的范圍是0-9,我們先準(zhǔn)備一個(gè)10位的二進(jìn)制數(shù)0000000000.假設(shè)第一個(gè)數(shù)組有3個(gè)電話號(hào)碼,分別是1,5,7,那么存儲(chǔ)這個(gè)數(shù)組的二進(jìn)制數(shù)就是0010100010,這個(gè)數(shù)字的1,5,7位上是1,其他位是0。假設(shè)第二個(gè)數(shù)組有6個(gè)電話號(hào)碼,分別是1,2,3,4,7,8那么存儲(chǔ)這個(gè)數(shù)組的二進(jìn)制數(shù)就是0110011110,這個(gè)數(shù)字的1,2,3,4,7,8位上是1,其他位是0。那么如何找出這兩個(gè)數(shù)組中相同的電話呢?只需要做一下位運(yùn)算中“按位與”(AND)的操作即可,同一位上兩個(gè)都是1的,還是1,只要有一個(gè)是0的,就是0。0010100010 & 0110011110 = 0010000010

一下就找出來是第1位和第7位上是1的一個(gè)二進(jìn)制數(shù)。

標(biāo)簽: java
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产91丝袜在线18| 一区二区三区电影在线播| 亚洲欧美怡红院| 成人晚上爱看视频| 欧美精品日韩一本| 久久精品久久精品| 久久人人97超碰人人澡爱香蕉| 亚洲黄色性网站| 亚洲区一区二| 亚洲女爱视频在线| 在线播放不卡| 综合欧美一区二区三区| 色综合网色综合| 精品美女一区二区| 国产激情一区二区三区| 欧美日韩久久久| 狠狠色综合色综合网络| 在线观看亚洲专区| 免费在线看一区| 欧美综合视频在线观看| 日本v片在线高清不卡在线观看| 久久婷婷丁香| 日日夜夜免费精品| 在线观看网站黄不卡| 樱桃成人精品视频在线播放| 1000精品久久久久久久久| 一区视频在线| 亚洲精选视频免费看| 欧美日韩久久久久久| 奇米影视在线99精品| 精品国产91洋老外米糕| 天天免费综合色| 狠狠色噜噜狠狠狠狠色吗综合| 26uuu久久天堂性欧美| 欧美在线网站| 国产凹凸在线观看一区二区| 欧美一级国产精品| 国产成人亚洲综合色影视| 日韩欧美成人激情| 色综合夜色一区| 中文字幕一区二| 国产农村妇女毛片精品久久莱园子| 亚洲国产欧美日韩另类综合 | 美女性感视频久久| 欧美伦理视频网站| 成人av免费在线| 成人免费在线视频观看| 国产人成精品一区二区三| 日韩在线一区二区三区| 欧美日韩aaa| 欧美在线1区| 亚洲精品菠萝久久久久久久| 美女黄网久久| 国产麻豆9l精品三级站| 久久婷婷国产综合精品青草| 亚洲一本视频| 污片在线观看一区二区| 69堂成人精品免费视频| 91玉足脚交白嫩脚丫在线播放| 中文字幕一区二区三区在线不卡| 久久蜜桃资源一区二区老牛| 顶级嫩模精品视频在线看| 亚洲国产精品成人综合色在线婷婷| 国产一区二区三区的电影| 激情综合五月婷婷| 国产欧美1区2区3区| 男人的天堂亚洲在线| 国产激情视频一区二区三区欧美| 日本一区二区三区国色天香| 亚洲欧美日韩专区| 国产精品18久久久久久久网站| 极品尤物久久久av免费看| 日韩电影一二三区| 精品福利视频一区二区三区| 亚洲免费激情| 极品少妇一区二区| 国产精品久久久久久一区二区三区 | 国产一区二区三区四区五区入口| 国产偷国产偷精品高清尤物| 亚洲一区日韩在线| 成人动漫视频在线| 亚洲一区二区欧美日韩 | 国产片一区二区三区| 久久高清国产| jizzjizzjizz欧美| 午夜精品国产更新| 久久综合成人精品亚洲另类欧美| 亚洲一区欧美激情| 不卡的电影网站| 亚洲午夜三级在线| 精品少妇一区二区三区免费观看 | 中文字幕一区二区三中文字幕| 欧美三级韩国三级日本三斤| 欧美色123| 蜜桃视频一区二区三区在线观看| 国产午夜精品美女毛片视频| 在线观看日韩精品| 午夜精品影院| 黄色精品一二区| 一区二区三区在线看| 精品日韩在线观看| 亚洲男同1069视频| 欧美一级淫片007| 一本一本久久| youjizz久久| 美国三级日本三级久久99| 一区在线播放视频| 欧美一区二区福利在线| 亚洲伊人观看| 欧美 日韩 国产在线 | 亚洲色图第一区| 91精品国产91久久综合桃花| 国产精品制服诱惑| 欧美日韩p片| 成人免费视频视频在线观看免费| 图片区小说区区亚洲影院| 国产亚洲一本大道中文在线| 欧美老女人第四色| 香蕉久久夜色| 在线国产精品一区| av男人天堂一区| 久久精工是国产品牌吗| 亚洲一级二级在线| 中国色在线观看另类| 欧美一级欧美一级在线播放| 一本久道久久综合婷婷鲸鱼| av电影在线观看一区| 久久精品国产在热久久| 亚洲欧美另类久久久精品2019| 国产视频一区在线播放| 日韩一区二区在线免费观看| 在线视频国产一区| 亚洲一区二区免费看| 精品久久久久香蕉网| 欧美日韩一区不卡| 久久亚洲精品伦理| 中文在线不卡| 国产精品草草| www.亚洲免费av| 国产精品一区不卡| 日韩不卡免费视频| 一区二区三区鲁丝不卡| 国产精品久久久一本精品| 久久青草欧美一区二区三区| 欧美一区中文字幕| 欧美日韩精品电影| 久久婷婷麻豆| 香蕉av777xxx色综合一区| 亚洲国产午夜| 精品电影一区| 狠狠色噜噜狠狠狠狠色吗综合| voyeur盗摄精品| 成人手机电影网| 国产精品88888| 国产一区欧美二区| 久久精品999| 老司机免费视频一区二区三区| 亚洲国产精品久久不卡毛片| 亚洲精品成人少妇| 亚洲免费av网站| 中文字幕在线不卡国产视频| 国产片一区二区| 欧美韩日一区二区三区四区| 久久男人中文字幕资源站| 精品日韩一区二区| 精品国产区一区| 欧美va亚洲va在线观看蝴蝶网| 欧美一级二级三级乱码| 欧美精品亚洲二区| 欧美精选午夜久久久乱码6080| 在线视频你懂得一区| 91国产视频在线观看| 欧美亚洲国产一区在线观看网站| 91久久一区二区| 欧美天天综合网| 制服丝袜在线91| 日韩精品一区二区三区中文精品| 欧美一二三四区在线| 精品国产一区二区三区久久久蜜月 | 久久精品中文| 国产精品色网| 久久精品二区| 欧美伊人精品成人久久综合97 | 成人福利视频在线| a4yy欧美一区二区三区| 欧美一区二区三区久久精品| 欧美精品日韩| 亚洲先锋成人| 99热这里只有成人精品国产| 国产欧美日韩综合精品二区| 久久精品女人| 国产精品 日产精品 欧美精品| 国产成人久久精品77777最新版本| 成人福利电影精品一区二区在线观看| 成人免费毛片高清视频| 欧美一区二区三区四区在线观看地址| 亚洲网址在线| 亚洲欧美日韩在线综合| 一本一道波多野结衣一区二区| 色婷婷狠狠综合|