摘要:轉(zhuǎn)換為社??ê?,從二者中找出匹配的社???。準(zhǔn)備初始化數(shù)據(jù)小明小紅小王小目標(biāo)從中篩選出中存在的卡片遍歷很容易看出,時(shí)間復(fù)雜度采用通過觀察發(fā)現(xiàn),兩個(gè)取相同的部分時(shí),每次都遍歷兩個(gè)。
問題
現(xiàn)有社??ê蜕矸葑C若干,想要匹配篩選出一一對(duì)應(yīng)的社??ê蜕矸葑C。
轉(zhuǎn)換為L(zhǎng)ist<社??? socialList,和List
創(chuàng)建社???/p>
/** * @author Ryan Miao */ class SocialSecurity{ private Integer id;//社保號(hào)碼 private Integer idCard;//身份證號(hào)碼 private String somethingElse; public SocialSecurity(Integer id, Integer idCard, String somethingElse) { this.id = id; this.idCard = idCard; this.somethingElse = somethingElse; } public Integer getId() { return id; } public Integer getIdCard() { return idCard; } public String getSomethingElse() { return somethingElse; } @Override public String toString() { return "SocialSecurity{" + "id=" + id + ", idCard=" + idCard + ", somethingElse="" + somethingElse + """ + "}"; } }
創(chuàng)建身份證類
class IdCard { private Integer id;//身份證號(hào)碼 private String somethingElse; public IdCard(Integer id, String somethingElse) { this.id = id; this.somethingElse = somethingElse; } public Integer getId() { return id; } public String getSomethingElse() { return somethingElse; } @Override public String toString() { return "IdCard{" + "id=" + id + ", somethingElse="" + somethingElse + """ + "}"; } }最簡(jiǎn)單的辦法:遍歷
只要做兩輪循環(huán)即可。
準(zhǔn)備初始化數(shù)據(jù):
private ArrayListsocialSecurities; private ArrayList idCards; @Before public void setUp(){ socialSecurities = Lists.newArrayList( new SocialSecurity(1, 12, "小明"), new SocialSecurity(2, 13, "小紅"), new SocialSecurity(3, 14, "小王"), new SocialSecurity(4, 15, "小peng") ); idCards = Lists.newArrayList( new IdCard(14, "xiaopeng"), new IdCard(13, "xiaohong"), new IdCard(12, "xiaoming") ); //目標(biāo): 從socialSecurities中篩選出idCards中存在的卡片 }
遍歷
@Test public void testFilterForEach(){ Listresult = new ArrayList<>(); int count = 0; for (SocialSecurity socialSecurity : socialSecurities) { for (IdCard idCard : idCards) { count++; if (socialSecurity.getIdCard().equals(idCard.getId())){ result.add(socialSecurity); } } } System.out.println(result); System.out.println(count);//12 = 3 * 4 //O(m,n) = m*n; }
很容易看出,時(shí)間復(fù)雜度O(m,n)=m*n.
采用Hash通過觀察發(fā)現(xiàn),兩個(gè)list取相同的部分時(shí),每次都遍歷兩個(gè)list。那么,可以把判斷條件放入Hash中,判斷hash是否存在來(lái)代替遍歷查找。
@Test public void testFilterHash(){ Setids = idCards .stream() .map(IdCard::getId) .collect(Collectors.toSet()); List result = socialSecurities .stream() .filter(e->ids.contains(e.getIdCard())) .collect(Collectors.toList()); System.out.println(result); //初始化 hash 3 //遍歷socialSecurities 4 //從hash中判斷key是否存在 4 //O(m,n)=2m+n=11 }
如此,假設(shè)hash算法特別好,hash的時(shí)間復(fù)雜度為O(n)=n。如此推出這種做法的時(shí)間復(fù)雜度為O(m,n)=2m+n. 當(dāng)然,更重要的是這種寫法更讓人喜歡,天然不喜歡嵌套的判斷,喜歡扁平化的風(fēng)格。
Hash一定會(huì)比遍歷快嗎想當(dāng)然的以為,hash肯定會(huì)比遍歷快,因?yàn)槭莌ash啊。其實(shí),可以算算比較結(jié)果。比較什么時(shí)候2m+n < m*n。
從數(shù)據(jù)歸納法的角度,n必須大于2,不然即演變程2m+2 < 2m。于是,當(dāng)n>2時(shí):
@Test public void testCondition(){ int maxN = 0; for (int m = 2; m < 100; m++) { for (int n = 3; n < 100; n++) { if ((2*m+n)>m*n){ System.out.println("m="+m +",n="+n); if (n>maxN){ maxN = n; } } } } System.out.println(maxN); }
結(jié)果是:
m=2,n=3 3
也就是說(shuō)n<=3的時(shí)候,遍歷要比hash快。事實(shí)上還要更快,因?yàn)閔ash還需要?jiǎng)?chuàng)建更多的對(duì)象。然而,大部分情況下,n也就是第二個(gè)數(shù)組的長(zhǎng)度是大于3的。這就是為什么說(shuō)hash要更好寫。當(dāng)然,另一個(gè)很重要的原因是lambda stream的運(yùn)算符號(hào)遠(yuǎn)比嵌套循環(huán)讓人喜愛。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67645.html
摘要:起步本章介紹如何不利用第三方庫(kù),僅用自帶的標(biāo)準(zhǔn)庫(kù)來(lái)構(gòu)造一個(gè)決策樹。構(gòu)造決策樹決策樹中需要一個(gè)屬性來(lái)指向樹的根節(jié)點(diǎn),以及特征數(shù)量。 起步 本章介紹如何不利用第三方庫(kù),僅用python自帶的標(biāo)準(zhǔn)庫(kù)來(lái)構(gòu)造一個(gè)決策樹。不過這可能需要你之前閱讀過這方面的知識(shí)。 前置閱讀 分類算法之決策樹(理論篇) 分類算法之決策樹(應(yīng)用篇) 本文使用將使用《應(yīng)用篇》中的訓(xùn)練集,向量特征僅有 0 和 1 兩種情況...
摘要:如何管理項(xiàng)目的數(shù)據(jù)這個(gè)問題似乎早已經(jīng)有答案了,無(wú)非就是使用,全局,整個(gè)應(yīng)用維護(hù)一個(gè)超大的,界面的顯示情況隨著超大的變化而變化。 vuex 如何管理 vue 項(xiàng)目的數(shù)據(jù)?這個(gè)問題似乎早已經(jīng)有答案了,無(wú)非就是使用 vuex ,全局 store,整個(gè)應(yīng)用維護(hù)一個(gè)超大的 Object,界面的顯示情況隨著超大 Object 的變化而變化。 看起來(lái)很簡(jiǎn)單,不就維護(hù)一個(gè) Object 嘛,實(shí)際上,要...
摘要:編程規(guī)范筆記上寫在前面從語(yǔ)言開始,自己陸續(xù)學(xué)習(xí)了,但是自從研究生做畢設(shè)接觸以來(lái),就愛不釋手,再也沒有動(dòng)力嘗試其他語(yǔ)言。一與的一大優(yōu)勢(shì)就是具備優(yōu)秀的可讀性,而這基于一套較為完整的公認(rèn)編程規(guī)范。如原本希望的結(jié)果是,結(jié)果卻完全一樣。 Python編程規(guī)范筆記(上) 寫在前面: 從C語(yǔ)言開始,自己陸續(xù)學(xué)習(xí)了C++/Java,但是自從研究生做畢設(shè)接觸Python以來(lái),就愛不釋手,再也沒有動(dòng)力嘗試...
閱讀 3905·2021-10-12 10:12
閱讀 1552·2021-10-11 10:58
閱讀 2401·2021-10-09 10:01
閱讀 2688·2021-09-24 09:48
閱讀 2784·2021-09-09 11:38
閱讀 3588·2019-08-30 15:44
閱讀 1810·2019-08-30 14:22
閱讀 601·2019-08-29 12:42