国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

淺談慢速的二次算法與快速的 hashmap

開發(fā) 后端 算法
我們聊到了二次時間與線性時間算法的話題,我認為在這里寫這篇文章會很有趣,因為避免二次時間算法不僅在面試中很重要——有時在現(xiàn)實生活中了解一下也是很好的!后面我會快速解釋一下什么是“二次時間算法” :)

[[424110]]

大家好!昨天我與一位朋友聊天,他正在準備編程面試,并試圖學習一些算法基礎知識。

我們聊到了二次時間quadratic-time線性時間linear-time算法的話題,我認為在這里寫這篇文章會很有趣,因為避免二次時間算法不僅在面試中很重要——有時在現(xiàn)實生活中了解一下也是很好的!后面我會快速解釋一下什么是“二次時間算法” :)

以下是我們將要討論的 3 件事:

  1. 二次時間函數(shù)比線性時間函數(shù)慢得非常非常多
  2. 有時可以通過使用 hashmap 把二次算法變成線性算法
  3. 這是因為 hashmap 查找非常快(即時查詢!)

我會盡量避免使用數(shù)學術語,重點關注真實的代碼示例以及它們到底有多快/多慢。

目標問題:取兩個列表的交集

我們來討論一個簡單的面試式問題:獲取 2 個數(shù)字列表的交集。 例如,intersect([1,2,3], [2,4,5]) 應該返回 [2]

這個問題也是有些現(xiàn)實應用的——你可以假設有一個真實程序,其需求正是取兩個 ID 列表的交集。

“顯而易見”的解決方案:

我們來寫一些獲取 2 個列表交集的代碼。下面是一個實現(xiàn)此需求的程序,命名為 quadratic.py

  1. import sys
  2.  
  3. # 實際運行的代碼
  4. def intersection(list1, list2):
  5. result = []
  6. for x in list1:
  7. for y in list2:
  8. if x == y:
  9. result.append(y)
  10. return result
  11.  
  12. # 一些樣板,便于我們從命令行運行程序,處理不同大小的列表
  13. def run(n):
  14. # 定義兩個有 n+1 個元素的列表
  15. list1 = list(range(3, n)) + [2]
  16. list2 = list(range(n+1, 2*n)) + [2]
  17. # 取其交集并輸出結果
  18. print(list(intersection(list1, list2)))
  19.  
  20. # 使用第一個命令行參數(shù)作為輸入,運行程序
  21. run(int(sys.argv[1]))

程序名為 quadratic.py(LCTT 譯注:“quadratic”意為“二次方的”)的原因是:如果 list1 和 list2 的大小為 n,那么內層循環(huán)(if x == y)會運行 n^2 次。在數(shù)學中,像 x^2 這樣的函數(shù)就稱為“二次”函數(shù)。

quadratic.py 有多慢?

用一些不同長度的列表來運行這個程序,兩個列表的交集總是相同的:[2]

  1. $ time python3 quadratic.py 10
  2. [2]
  3.  
  4. real 0m0.037s
  5. $ time python3 quadratic.py 100
  6. [2]
  7.  
  8. real 0m0.053s
  9. $ time python3 quadratic.py 1000
  10. [2]
  11.  
  12. real 0m0.051s
  13. $ time python3 quadratic.py 10000 # 10,000
  14. [2]
  15.  
  16. real 0m1.661s

到目前為止,一切都還不錯——程序仍然只花費不到 2 秒的時間。

然后運行該程序處理兩個包含 100,000 個元素的列表,我不得不等待了很長時間。結果如下:

  1. $ time python3 quadratic.py 100000 # 100,000
  2. [2]
  3.  
  4. real 2m41.059s

這可以說相當慢了!總共花費了 160 秒,幾乎是在 10,000 個元素上運行時(1.6 秒)的 100 倍。所以我們可以看到,在某個點之后,每次我們將列表擴大 10 倍,程序運行的時間就會增加大約 100 倍。

我沒有嘗試在 1,000,000 個元素上運行這個程序,因為我知道它會花費又 100 倍的時間——可能大約需要 3 個小時。我沒時間這樣做!

你現(xiàn)在大概明白了為什么二次時間算法會成為一個問題——即使是這個非常簡單的程序也會很快變得非常緩慢。

快速版:linear.py

好,接下來我們編寫一個快速版的程序。我先給你看看程序的樣子,然后再分析。

  1. import sys
  2.  
  3. # 實際執(zhí)行的算法
  4. def intersection(list1, list2):
  5. set1 = set(list1) # this is a hash set
  6. result = []
  7. for y in list2:
  8. if y in set1:
  9. result.append(y)
  10. return result
  11.  
  12. # 一些樣板,便于我們從命令行運行程序,處理不同大小的列表
  13. def run(n):
  14. # 定義兩個有 n+1 個元素的列表
  15. list1 = range(3, n) + [2]
  16. list2 = range(n+1, 2*n) + [2]
  17. # 輸出交集結果
  18. print(intersection(list1, list2))
  19.  
  20. run(int(sys.argv[1]))

(這不是最慣用的 Python 使用方式,但我想在盡量避免使用太多 Python 思想的前提下編寫代碼,以便不了解 Python 的人能夠更容易理解)

這里我們做了兩件與慢速版程序不同的事:

  1. 將 list1 轉換成名為 set1 的 set 集合
  2. 只使用一個 for 循環(huán)而不是兩個

看看 linear.py 程序有多快

在討論 為什么 這個程序快之前,我們先在一些大型列表上運行該程序,以此證明它確實是很快的。此處演示該程序依次在大小為 10 到 10,000,000 的列表上運行的過程。(請記住,我們上一個的程序在 100,000 個元素上運行時開始變得非常非常慢)

  1. $ time python3 linear.py 100
  2. [2]
  3.  
  4. real 0m0.056s
  5. $ time python3 linear.py 1000
  6. [2]
  7.  
  8. real 0m0.036s
  9. $ time python3 linear.py 10000 # 10,000
  10. [2]
  11.  
  12. real 0m0.028s
  13. $ time python3 linear.py 100000 # 100,000
  14. [2]
  15.  
  16. real 0m0.048s <-- quadratic.py took 2 minutes in this case! we're doing it in 0.04 seconds now!!! so fast!
  17. $ time python3 linear.py 1000000 # 1,000,000
  18. [2]
  19.  
  20. real 0m0.178s
  21. $ time python3 linear.py 10000000 # 10,000,000
  22. [2]
  23.  
  24. real 0m1.560s

在極大型列表上運行 linear.py

如果我們試著在一個非常非常大的列表(100 億 / 10,000,000,000 個元素)上運行它,那么實際上會遇到另一個問題:它足夠  了(該列表僅比花費 4.2 秒的列表大 100 倍,因此我們大概應該能在不超過 420 秒的時間內完成),但我的計算機沒有足夠的內存來存儲列表的所有元素,因此程序在運行結束之前崩潰了。

  1. $ time python3 linear.py 10000000000
  2. Traceback (most recent call last):
  3. File "/home/bork/work/homepage/linear.py", line 18, in <module>
  4. run(int(sys.argv[1]))
  5. File "/home/bork/work/homepage/linear.py", line 13, in run
  6. list1 = [1] * n + [2]
  7. MemoryError
  8.  
  9. real 0m0.090s
  10. user 0m0.034s
  11. sys 0m0.018s

不過本文不討論內存使用,所以我們可以忽略這個問題。

那么,為什么 linear.py 很快呢?

現(xiàn)在我將試著解釋為什么 linear.py 很快。

再看一下我們的代碼:

  1. def intersection(list1, list2):
  2. set1 = set(list1) # this is a hash set
  3. result = []
  4. for y in list2:
  5. if y in set1:
  6. result.append(y)
  7. return result

假設 list1 和 list2 都是大約 10,000,000 個不同元素的列表,這樣的元素數(shù)量可以說是很大了!

那么為什么它還能夠運行得如此之快呢?因為 hashmap!!!

hashmap 查找是即時的(“常數(shù)級時間”)

我們看一下快速版程序中的 if 語句:

  1. if y in set1:
  2. result.append(y)

你可能會認為如果 set1 包含 1000 萬個元素,那么這個查找——if y in set1 會比 set1 包含 1000 個元素時慢。但事實并非如此!無論 set1 有多大,所需時間基本是相同的(超級快)。

這是因為 set1 是一個哈希集合,它是一種只有鍵沒有值的 hashmap(hashtable)結構。

我不準備在本文中解釋 為什么 hashmap 查找是即時的,但是神奇的 Vaidehi Joshi 的 basecs 系列中有關于 hash table 和 hash 函數(shù) 的解釋,其中討論了 hashmap 即時查找的原因。

不經意的二次方:現(xiàn)實中的二次算法!

二次時間算法真的很慢,我們看到的的這個問題實際上在現(xiàn)實中也會遇到——Nelson Elhage 有一個很棒的博客,名為 不經意的二次方,其中有關于不經意以二次時間算法運行代碼導致性能問題的故事。

二次時間算法可能會“偷襲”你

關于二次時間算法的奇怪之處在于,當你在少量元素(如 1000)上運行它們時,它看起來并沒有那么糟糕!沒那么慢!但是如果你給它 1,000,000 個元素,它真的會花費幾個小時去運行。

所以我認為它還是值得深入了解的,這樣你就可以避免無意中使用二次時間算法,特別是當有一種簡單的方法來編寫線性時間算法(例如使用 hashmap)時。

總是讓我感到一絲神奇的 hashmap

hashmap 當然不是魔法(你可以學習一下為什么 hashmap 查找是即時的!真的很酷!),但它總是讓人 感覺 有點神奇,每次我在程序中使用 hashmap 來加速,都會使我感到開心 :) 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2021-09-15 11:38:36

Hashmap二次算法列表

2020-10-29 15:13:55

數(shù)字科技金融行業(yè)互聯(lián)網

2011-08-05 12:36:01

2017-03-24 21:26:26

代碼架構Java

2015-09-01 15:12:45

JavaHashMap那點事

2012-10-09 13:53:33

大型網站算法架構

2010-05-19 13:05:39

思科認證CCIE安博

2018-07-13 05:40:06

數(shù)據(jù)中心運維可視化

2021-10-22 08:21:27

CSS 技巧文字二次加粗

2016-05-11 10:49:03

醫(yī)療SaaS

2021-09-03 13:54:45

雙重勒索勒索軟件攻擊

2012-11-27 10:45:13

路由器LANDHCP

2009-07-02 15:12:50

JSP Jdbc

2021-06-17 12:54:31

勒索軟件網絡攻擊贖金

2021-12-05 21:05:49

前端JSON API

2024-03-18 09:44:02

HashMap算法Java

2019-04-30 13:09:30

蘋果微軟KOL

2022-03-11 22:52:29

調試版本編譯器

2012-08-21 11:55:46

2022-10-20 10:38:11

無服務器RustC++
點贊
收藏

51CTO技術棧公眾號

亚洲一区二区三区爽爽爽爽爽 | 日韩黄色大片| 免费看毛片的网址| 欧美疯狂做受xxxx富婆| 成人国产精品一级毛片视频| wwww.国产| 日韩视频在线免费观看| 丁香激情综合国产| а√天堂资源官网在线资源| 91青青草免费在线看| 色综合久久六月婷婷中文字幕| 色愁久久久久久| 国语对白在线视频| 日本高清不卡的在线| 亚洲一区二区三区四区在线| 日韩av中文字幕一区| 中文字幕在线观| 亚洲自拍偷拍一区| 韩国中文免费在线视频| 国产在线日韩在线| 欧美日韩免费在线| 欧美日韩久久| 91色在线看| 最好看的中文字幕久久| 久久99国产精品久久99大师| 黄页网站免费在线观看| 国产91一区二区三区| 精品毛片乱码1区2区3区| 精品在线视频一区| 亚洲免费一区三区| 国产大片在线免费观看 | 亚洲国产黄色片| www..com久久爱| 国产精品手机在线播放 | 青青青免费视频在线2| 国产精品一区二区a| 精品偷拍各种wc美女嘘嘘| 中文字幕久久午夜不卡| 欧美日韩综合| 欧美在线在线| 免费网站免费进入在线| 国产 欧美 日韩 一区| 日韩美女毛茸茸| 日韩精品在线免费观看| 亚洲色图欧美激情| 久久99国产精品免费| 91成人噜噜噜在线播放| 免费a在线看| 日本特黄a级片| 日本婷婷久久久久久久久一区二区| 日韩小视频在线| 5858s免费视频成人| 亚洲欧美综合色| 国产不卡在线视频| 好看不卡的中文字幕| 91精品国产一区二区在线观看| 亚洲女人天堂在线| 2018日日夜夜| 欧美综合激情| 国产精品私拍pans大尺度在线| 亚洲欧美国产制服动漫| 欧美色图第一页| 国产精品天美传媒| 成人爱爱电影网址| 韩日欧美一区二区三区| 欧美午夜电影在线观看 | 在线看片国产福利你懂的| 精品乱码一区二区三四区视频| av观看免费在线| 天天做天天躁天天躁| 伊人久久大香线蕉av一区| 国产成人看片| 亚洲影视中文字幕| 国产在线观看一区二区三区 | 亚洲影院在线看| 国产精品偷伦视频免费观看国产| 欧美大片在线免费观看| 精品国产欧美一区二区五十路 | 久久人人爽人人爽爽久久| 亚洲成人动漫在线播放| 精品剧情v国产在线观看在线| 欧美日韩中文精品| 精品视频123区在线观看| 欧美日韩一卡二卡| 91精品在线一区二区| 欧美大黄免费观看| 亚洲精品av在线| 亚洲欧美激情精品一区二区| 亚洲欧美国产高清va在线播| 国产亚洲精品日韩| 电影一区二区在线观看| 国产一区福利在线| 丝瓜av网站精品一区二区| 日本成人在线视频网站| 国产福利一区二区三区| av色综合久久天堂av综合| 国产丝袜美腿一区二区三区| 国产欧美一区二区精品忘忧草| 国产精品青草综合久久久久99| 中文字幕日本不卡| 欧美日韩一区二区电影| 亚洲精品视频播放| 超碰97人人做人人爱少妇| 日本亚洲欧美三级| 美女主播视频一区| 色哺乳xxxxhd奶水米仓惠香| 欧美三级理论片| 日本中文字幕视频在线| 欧美三区四区| 欧美亚洲精品在线| 青青国产91久久久久久| 欧美激情在线一区二区三区| 欧美亚洲动漫精品| 色妞一区二区三区| 1区1区3区4区产品乱码芒果精品| 一区精品在线| 一区二区电影网| 国产成人精品一区二三区在线观看 | 久蕉在线视频| 免费观看亚洲天堂| 爽爽淫人综合网网站| 视频三区在线观看| 波多野结衣91| 精品久久久国产| 日韩中文在线视频| 成人一区二区电影| 男女超爽视频免费播放| 婷婷视频在线| 久久99国产成人小视频| 国产成人三级在线观看| 欧美视频完全免费看| 青草青草久热精品视频在线网站| 色涩成人影视在线播放| 看黄的a网站| 91蝌蚪精品视频| 国产mv日韩mv欧美| 亚洲精品动漫100p| 久久亚洲高清| 日本中文字幕电影在线观看 | 97在线播放视频| 成人美女大片| 久久精品九九| 欧美人动与zoxxxx乱| 日韩 欧美一区二区三区| 偷拍日韩校园综合在线| 欧美在线国产精品| 国产天堂在线播放| 精品一区二区三区四区五区| 国产999精品久久久久久绿帽| 精品国产精品网麻豆系列| 国产一区二区精品在线| 国产免费av在线| 中文字幕午夜精品一区二区三区 | 国产一区二区成人久久免费影院| 欧美一区二区播放| 香蕉久久夜色| 中文不卡1区2区3区| 精品写真视频在线观看 | 亚洲欧美另类久久久精品| 欧美最猛黑人xxxx黑人猛叫黄| 国产理论片免费观看| 99久久夜色精品国产亚洲1000部| 亚洲电影第三页| 国产亚洲欧美另类一区二区三区| 日本在线天堂| 国产黄色成人av| 国产+成+人+亚洲欧洲| 精品欧美日韩精品| 精品国产一区二区三区成人影院 | 国产精品videosex极品| 欧美三片在线视频观看| 伊人狠狠色丁香综合尤物| 久久九九精品视频| 欧美性猛交xxxx富婆弯腰| 神马影院午夜我不卡| 亚洲一区二区三区中文字幕在线观看 | 欧美在线视频日韩| 亚洲高清在线播放| 亚洲专区**| 欧美精品v国产精品v日韩精品| 自拍亚洲欧美老师丝袜| 欧美电影免费网站| 欧美日韩一级视频| 日韩av播放器| 999亚洲国产精| 久久久噜噜噜久久久| 曰本三级在线| 亚洲精品久久久蜜桃| 亚洲美女网站18| 国产精品99视频| 久久久精品免费视频| 国产福利小视频在线| 久久久噜噜噜久久中文字幕色伊伊| 国产精品一国产精品最新章节| 24小时成人在线视频| 日韩视频中午一区| 久久久久久青草| 亚洲丰满少妇videoshd| 日韩avxxx| 国产真实乱偷精品视频免|