1樓:小齊本齊
當然不要背。。。
還記得《演算法導論》引入插入排序的例子:打牌。
不過不能學胡適先生啊~
插入排序的優化是希爾排序,稍微知道就行,不知道也無妨。
然後選擇排序也很直觀,每一輪「選擇」最小值排好。選擇排序每一輪選擇最小值的過程用 heapify() 來優化,就公升級為 heap sort,堆排序,但是實踐中效果不好,不常用。
那麼效率高常用的有哪些?
歸併排序和快排。
占個坑之後來答。
2樓:手有魚香
最好的記演算法的方式是,在你準備記這個演算法的時候,先看看這個演算法要解決的問題,以及有什麼特點,自己先實現一遍。
如果實現出來與目標演算法差不多,你根本不用背了。
如果與目標有點差距,看一下差距在哪,然後做修改,這樣你只需要記住一些小細節。
如果無從下手,說明你的知識儲備還不足以開始學習這個演算法。
比如快速排序,解決的是資料排序問題,時間複雜度n log(n)。
要能理解上面的內容。至少得明白什麼是排序,以及時間複雜度的衡量標準。
有了這些基礎之後,自己先實現一遍,再和別人的演算法對比,就容易記住了。
3樓:NILL
看完諸君的答案,總結下:
三種回答思路:
1. 熟能生巧經驗論
2. 搞明白原理理解論
3. 不需要記,會查就行
我個人是十分主張第三種,但是考試形式不允許。那麼,在短時間內可以試著結合2+1,理解大概輪廓+巧記(按照你自己的方法)不理解的地方。
尊重客觀規律,發揮主觀能動性,最近學習馬克思主義領會的精華,因為,快期末了。
4樓:flyingfish
演算法靠的是理解。
如果一時不能領悟,那就搞5到10個小資料集合在紙上模擬一下演算法的物理過程。
先模擬冒泡,再合併,然後快排。想清楚過程後,用程式來代替模擬過程。
5樓:二胖
反正我是背的,但是這僅限於去面試的時候,因為面試的時候會讓你寫各種排序。
以上都是毫無卡頓的寫出來,也都順利的拿到了offer,因為去面試之前都背熟了。
工作中就再也沒背過,一般需要排序的時候要麼調庫要麼搜尋引擎查一下。
我個人認為,在工作中對於一些常見的演算法,用不著非得能一字不落的揹著寫出來,但是你一定得知道它們的原理以及應用場景。
6樓:
關鍵還是思想,比如用greedy就可以得出selection sort和insertion sort,用divide and conquer就可以得到merge sort和quick sort。其他演算法思想多見的也就dynamic programming和linear programming了。理解了這四種思想(或者前三種)再看學過的演算法就可以理解著記憶了,雖然真正學好這些思想更難…
初學還是背……其實我覺得演算法的內容和思想應該雜糅著講效果會更好。
7樓:北南
背下來吧,就背快排和堆排就行,歸併排序不用背,但最好背下來怎麼合併兩個有序鍊錶。
這三個(其實是兩個半)背下來,可以很多變化,比如說快排可以變換成找top k或者中位數的selection演算法。堆排背下來就搞懂了二叉堆,堆可以做N多涉及優先順序佇列的演算法,最短路也用得到。
這些搞下來,你就熟悉了陣列,鍊錶,堆,二叉樹,然後你會發現二叉樹可以放在陣列裡,也可以像鍊錶那樣連著。圖也是可以用陣列和鍊錶來表達成鄰接表,然後你會發現Hash表也是類似的結構。
到此為止,你只需要背這兩個半的排序,本科時代的資料結構與演算法你就基本學通了。。。。
有些朋友對用類似QuickSort的演算法在linear時間找top k有疑問,這有個課程
Selection - Quicksort | Coursera
還有這個
Quickselect Algorithm - GeeksforGeeks
其實就是一種基於快排演算法的不完全排序演算法,咱們不用把n個元素都排好序,但只要把大的k個元素換到前面就好了。這個複雜度是O(n)的,因為總的交換的次數的極限是n的常量倍。
8樓:sericus
如果是複雜度為平方的演算法(冒泡,插入等等),根本不用背,原理很簡單,自己寫就行。
如果是快排,歸併之類的,可以用庫函式啊,優先佇列也可以啊。實在是要寫的話請一定清楚地理解好遞迴函式的所有細節。這樣差不多就可以了。
9樓:Abcd
記不住主要是因為沒有理解演算法的原理,比如快排就是每次拿出乙個元素,把陣列中比它小的放左邊,比它大的放右邊,再分治遞迴,把兩側的陣列排好序,想忘記都難。排序的演算法最重要的用途有兩個,乙個是考試面試,乙個是啟發思維,培養程式思維能力。這都需要深入了解演算法的內在邏輯,不僅是能寫對,還得能證明,能變通。
可以學習下演算法導論,不要看嚴老師那本資料結構,演算法導論循序漸進,庖丁解牛,深入淺出,遠遠比其他的教材容易理解又能揭示本質。
10樓:
用的多了,自然就記住了。
如果不是常用知識,記它幹嘛?能查到得知識,都沒必要記,留著腦子想更有用的事情不好嗎?
個人認為,學計算機,會查比會背重要的多。
11樓:張泉
歸併排序:體育課上已經站好4排隊。老師說:
12排合成一排,34排合成一排。然後大家開始前後合併,當我前面的人站入新隊之後,我和另一隊剩下的人比較下個頭,我矮我就站入新隊她矮她就站入.....兩排隊完成了一些活動之後,老師又說:
現在站成一排!就用同樣的方法站成一排!
氣泡排序:狹窄的走道上大家亂序站成一排,老師說我們按高矮個發號牌!1號!
最後乙個人開始看自己是不是比前邊的人矮,是就往前換,不是的話就換前邊的人往前比較和交換,直到最矮的換到前面。然後2號!在剩下的人當中繼續這麼做直到第二矮的換到1號後面....
依次找到3號4號......
快速排序:體育課上人太多老師覺得分兩撥活動。找個個子適中的人,比他矮的去跑步,比他高的去打球。
打球的那組人還是多,又指定乙個人,比他矮的踢足球,比他高的打籃球。.......找不到合適的例子啦,勉強說個意思吧。
12樓:阿豆豆阿豆
這玩意不用背,但是自己一定要實現一次,以後就算忘了,回頭看看思路也能寫出來。最近也在看演算法,剛開始的時候寫著挺痛苦,給了思路也寫不出來,但是後面寫多了就越來越容易
13樓:[已重置]
不需要背啊,知道關鍵點就會寫了
冒泡\選擇\插入: 反正就兩個for迴圈
堆排: 用堆
快排: 自上而下分治
歸併: 自下而上分治
14樓:非著名程式設計師
賣油翁的故事告訴我們:熟能生巧;
運動員的故事告訴我們:持續長久的不斷的重複練習,會產生肌肉記憶,從而可以很好的完成每乙個運動動作。
程式設計師我感覺已經很好了,具體演算法的使用你可能記不住,但是演算法的名字你應該能記住吧!什麼時候該用什麼演算法?
我們程式設計靠的當然也是不斷地練習,實踐和使用,常用的東西用的多了自然就記住了。但是如果不常用的東西你應該了解,知道,具體用法你可以查文件,查資料,跟開卷考試一樣。
演算法可能用的不多,但是常用演算法地名字和使用場景你知道就行。具體用法可以查,又不是讓你閉卷考試。
再說了,死記硬背解決不了問題,一年用一次的話,用的時候背過了,下次用的時候早就忘了,理解最重要,知道什麼時候用什麼就行,用的時候查文件。記住:讀書百遍其義自見。
程式設計亦如此!!!
15樓:李魔劍
O(n^2)的記住冒泡
O(nlogn)的記住快排
O(n)的記住基排
相信我,其他的沒卵用
快排也只要記乙個7行左右的簡化版就行了,那個單獨寫個劃分函式的純屬蛋疼
16樓:Cifer
想想高數裡面學的那些數學公式, 做題時你知道該用哪個公式, 也能輕易默寫出那個公式, 但未必能立馬想出公式是怎麼推導出來的. 演算法也是這樣吧, 其實用多了的話就算你不刻意去背也自然記住了.
但你必須第一次切實的自己去推導出來, 以後才好直接拿來用
17樓:安陽
上面有人講這六種基礎排序,選擇,冒泡,插入,快排,歸併,堆排序。
在比較難的快排,歸併和堆排序中,堆排序應該是最容易的,只要知道最大堆的實現方法,就能夠實現堆排序。
快排和歸併用的是分治的思想。
雖然都是分治,但是這兩種分治還是有很大區別的。
還是要理解思想吧。
實在理解不了就背吧
18樓:
理解的基礎上歸下類,記下每種特點就行了,還是挺直觀的。下面就以常用的六個排序演算法(公升序)為例說下特點。
三種n^2的:冒泡,選擇和插入。
冒泡:目的,每次排好最後乙個。方式,從第乙個開始檢視相鄰倆,不合適(前面的大)就交換,這樣最後乙個一定是最大的。
然後,陣列元素減一(最後乙個排好了扔了吧),縮小規模再來一次。
選擇:每次從待選陣列中拎出乙個最大的來,放到最後,然後縮小規模再來一次。
插入:假設後面的序列是有序的,每次從剩餘陣列中拎出最後乙個,插入到有序陣列中合適位置。然後剩餘陣列縮小規模再插一次。
三種nlgn的:快排,歸併和堆排。
快排:每次隨便選乙個,把它整合適了(放到最終有序陣列正確位置),然後比他小的扔左邊,比他大的扔右邊。然後除掉該數字外的左右子陣列各自縮小規模再來一次。
歸併:隨便找個位置,砍成兩半。這兩半各自縮小規模了吧,然後假設他們自己來了好多次排好了。最後合併這倆有序陣列就行。
堆排:這個比較有意思,核心要實現乙個堆化函式。這個函式什麼意思呢,就是假設乙個大頂堆只有根元素不合法,左右子樹都合法(符合堆性質),然後把堆頂元素一路往下搞,跟冒泡差不多,使整個樹滿足堆的性質。
然後呢,把整個陣列搞成符合堆的性質(自底而上,從第乙個有孩子的元素一直呼叫堆化函式搞到根元素),把第乙個(堆頂,即最大元素)和最後乙個交換。如此一來,規模縮小乙個,再來一次(堆化&交換)。
其他還有shell排啦,桶排啦。不急,消化了這六個再說。
系列專題
19樓:羽涅
用得少就會忘,很正常。
沒必要太死記硬背,把演算法背後的原理理解了,用的時候查一下就行。
當然如果是要面試的話,還是可以稍微背一下的。
怎樣反駁 程式 演算法 資料結構 的言論?
程式 演算法 資料結構 這個沒有錯.但是老闆需要的不是程式,而是乙個特定的應用程式.白馬非馬.應用程式不是程式.說 程式 演算法 資料結構 缺乏現實意義.對需求的滿足沒有幫助.以上.if 0 你就是說贏他也沒用呀,你基本功還是比不過他呀.else 你管他說什麼啊.練自己的本事就好了嘛.endif 很...
學新的語言還是學演算法資料結構?
早起的鳥兒 資料結構真的很重要!你可以學一門語言的時候,順便再用它來寫資料結構。資料結構學的差不多的時候,這門語言的語法也基本上學完了。其實,同一類的語言語法相似點很多的,只要學會一種,其他的都很好學。 賴敬之 瀉藥個人認為基礎打好比較重要,C語言的話建議先閱讀一遍 C primer plus 這本...
資料結構的排序中為什麼關鍵字會重複?
James Yin 因為查詢可以有多種策略,比如 查全部 字串匹配 findall 第乙個 最後乙個 stl lower bound upper bound 等等。另外,如果排序演算法不允許重複,那對元素可重複的序列要怎麼排序呢?題主說的唯一匹配,沒理解錯的話應該指map類資料結構,比如二叉查詢樹 ...