提升演算法
A. 怎麼提高演算法
介紹一個討論吧:
http://post..com/f?kw=c%D3%EF%D1%D4
B. 搞編程的我是個演算法渣,怎麼樣能很快的提升演算法水平有什麼必要的或者非常基礎的演算法需要掌握
找任何語言的網友總結的基礎演算法教程,網上有大量,參照代碼從程序的角度去理解(語言是工具,思想是核心,不要告訴我你換了種語言就不懂演算法)
往後有時間再慢慢補一下數學,畢竟演算法基礎還是數理,再慢慢提升演算法思想吧。
我這里說的是邏輯演算法很容易理解,但如果數據結構之類的演算法,就需要一定的數學知識了
其實一般程序員剛工作時都不會涉及非常復雜的演算法的,除非你後期做到主程或核心功能開發吧,否則不同的語言別人寫好的第三方類庫其實也提供了很多演算法的現成方案,懂套用就可以了。
C. 如何能快速提高演算法能力
對著這個列表做一些題,分析每道題的特點和出錯點,總結演算法和自己的模板。
做完初期就差不多可以應付校賽了。
然後再是中期。。。
OJ上的一些水題(可用來練手和增加自信)
(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)
初期:
一.基本演算法:
(1)枚舉. (poj1753,poj2965)
(2)貪心(poj1328,poj2109,poj2586)
(3)遞歸和分治法.
(4)遞推.
(5)構造法.(poj3295)
(6)模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
(1)圖的深度優先遍歷和廣度優先遍歷.
(2)最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓撲排序 (poj1094)
(5)二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
(6)最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.數據結構.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、歸並排(與逆序數有關)、堆排) (poj2388,poj2299)
(3)簡單並查集的應用.
(4)哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼樹(poj3253)
(6)堆
(7)trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜索
(1)深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
(1)背包問題. (poj1837,poj1276)
(2)型如下表的簡單DP(可參考lrj的書 page149):
1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
(1)組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關系.
(POJ3252,poj1850,poj1019,poj1942)
(2)數論.
1.素數與整除問題
2.進制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
(3)計算方法.
1.二分法求解單調函數相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
(1)幾何公式.
(2)叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
(3)多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
中級:
一.基本演算法:
(1)C++的標准模版庫的應用. (poj3096,poj3007)
(2)較為復雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
(1)差分約束系統的建立和求解. (poj1201,poj2983)
(2)最小費用最大流(poj2516,poj2195)
(3)雙連通分量(poj2942)
(4)強連通分支及其縮點.(poj2186)
(5)圖的割邊和割點(poj3352)
(6)最小割模型、網路流規約(poj3308, )
三.數據結構.
(1)線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)靜態二叉檢索樹. (poj2482,poj2352)
(3)樹狀樹組(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)並查集的高級應用. (poj1703,2492)
(6)KMP演算法. (poj1961,poj2406)
四.搜索
(1)最優化剪枝和可行性剪枝
(2)搜索的技巧和優化 (poj3411,poj1724)
(3)記憶化搜索(poj3373,poj1691)
五.動態規劃
(1)較為復雜的動態規劃(如動態規劃解特別的施行商問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
(3)樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
(1)組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關系和母函數.
(2)數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴展的歐幾里德(中國剩餘定理) (poj3101)
(3)計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)隨機化演算法(poj3318,poj2454)
(5)雜題.
(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
(1)坐標離散化.
(2)掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多邊形的內核(半平面交)(poj3130,poj3335)
(4)幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429
)
高級:
一.基本演算法要求:
(1)代碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保證正確性和高效性. poj3434
二.圖演算法:
(1)度限制最小生成樹和第K最短路. (poj1639)
(2)最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最優比率生成樹. (poj2728)
(4)最小樹形圖(poj3164)
(5)次小生成樹.
(6)無向圖、有向圖的最小環
三.數據結構.
(1)trie圖的建立和應用. (poj2778)
(2)LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 在線演算法
(RMQ+dfs)).(poj1330)
(3)雙端隊列和它的應用(維護一個單調的隊列,常常在動態規劃中起到優化狀態轉移
的
目的). (poj2823)
(4)左偏樹(可合並堆).
(5)後綴樹(非常有用的數據結構,也是賽區考題的熱點).
(poj3415,poj3294)
四.搜索
(1)較麻煩的搜索題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)廣搜的狀態優化:利用M進制數存儲狀態、轉化為串用hash表判重、按位壓縮存儲
狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的優化:盡量用位運算、一定要加剪枝、函數參數盡可能少、層數不易過大
、可以考慮雙向搜索或者是輪換搜索、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
(1)需要用數據結構優化的動態規劃.
(poj2754,poj3378,poj3017)
(2)四邊形不等式理論.
(3)較難的狀態DP(poj3133)
六.數學
(1)組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關系理論.
(2)博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
(1)半平面求交(poj3384,poj2540)
(2)可視圖的建立(poj2966)
(3)點集最小圓覆蓋.
(4)對踵點(poj2079)
八.綜合題.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)
D. 如何提高自己的演算法
計算的准確性不但在「應試教育」中佔主要地位,在「素質教育」的今天同樣重要。因為式子題的計算是學生解決實際問題的基礎,是每個小學生必須掌握的數學基礎知識和基本技能。只有計算過硬,才能進一步學好應用題和其他學科知識。式子題計算是各年級的重要內容,根據學生的考試和作業看,造成成績不理想的原因是計算能力差,准確率不高。造成這種現象的原因是多方面的:首先是低年級忽略了口算訓練,其次是在各年級中輕視了式子題的教學,誤認為計算式子題只要弄清計算順序,便能算出來,這種想法造成學生計算不細心,准確率低,從而缺乏攻克復雜式子題的興趣和信心。
計算準確,要從低年級抓起,不僅要教學生演算法,更要重視口算的訓練。口算是筆算、估算的基礎,只有讓學生在理解的基礎上掌握了口算的方法,堅持練習,逐步達到熟練的程度,才會在中、高年級中熟練、准確地計算。同樣,中高年級也不能忽視口算的練習。
式子題的訓練,還要從讀題做起,讀題要求學生正確規范,這樣有助於弄清運算順序。有括弧題,如(a+b)c,可讀作a與b的和乘以c,不能把括弧讀出來,嚴格要求學生讀准,從中悟出運算順序,確定自己的演算法。弄清計算順序是計算的前期。不這樣訓練,學生容易忽略和弄錯順序,對「准確」沒有把握,長期這樣,學生會對數學失去信心,失去積極性,教師也會對學生的計算失去信心。
文字題是式子題的讀題與列式計算的訓練,在讀題的基礎上,讓學生列出算式,正反結合訓練,會對學生的計算進行強化。文字題既然是計算題的敘述,那麼解決文字題就是列出綜合算式,它與應用題的解答有別,不能用分步計算,但可以用分步式分析。分析後列出綜合計算是解決文字題的正確做法。
加強運算定律和運算性質的教學,多用於實際計算,讓學生充分理解算理,掌握法則,鼓勵學生運用簡便演算法。除題目要求簡算外,教師要有意識地要求學生能簡算的奧運用簡算,提高學生的簡算興趣,使簡算貫穿於一切計算之中,逐步摸索計算的技巧,做到計算合理,靈活,准確,迅速,有力的提高學生的計算能力。
計算準確性的訓練要常抓不懈,養成檢查、驗算的習慣。對於一般的學生,式子題做完了不願意檢查、驗算,造成准確率低的現象。針對這種現象,要有意識的訓練,培養學生驗算,長此以往,「准確」就有保證了。
在式子題的計算中,採用適當的計算方法也要給與指導和練習。如高年級的分數、小數、百分數的混合運算,要根據題和自己的特長確定具體演算法。讓學生針對題型動腦思考,自做練習,在和他人比較,找到巧妙的演算法,也是准確性的訓練。
對學生經過長期多方面的計算訓練,培養學生嚴格、認真、對計算結果負責的良好習慣以及有毅力、肯動腦、克服困難的意志,學生的計算能力就會明顯提高,為下一步學習打下堅實基礎
E. 提高演算法的可靠性有什麼用
遇到意外的輸入數據時能防止演算法崩潰。
F. 學java的,請問如何提高演算法能力
《演算法導論》基本不需要什麼數學基礎,會數數、加減乘除就可以,看的時候一下理解不了就可以在稿紙上模擬幾步,舉幾個樣例。入門的演算法不外乎轉換、抽象、分解問題的思想
G. java演算法怎麼提高
暈 你不用拿分來誘惑大家
建議你找本清華出的數據結構,好好研究2遍,絕對能上個層次
好的回答往往會令你有些失望 因為那意味著大量的練習
H. 該怎麼提高自己的演算法能力
先好好讀書,這里我推薦the
art
of
unix
programming,我自己便是看完這書後技術能力才有質的變化。
然後,減少看微博、博客、知乎等的時間,最好是徹底不看,這些資訊的網站是非常浮躁的,很難學到真正的東西。
學門新語言,比方說go,
python,
ruby,
haskell等等,然後用這門語言去做一個開源項目,比方說,一個orm。然後,再去看這門語言的成功項目的源碼。看看自己寫的跟別人的不足是什麼,然後,再把自己的項目重新實現一遍。自覺略有所得之後換個方向,比方說模板,再搞個開源項目。伺服器後端的mvc各搞一次,還可以再去搞前端的。
最後,心態要好,不要急於求成,欲速則不達。修煉一年能有小成就不錯的了~
I. 如何提高機器學習演算法的召回率
最近在做文本分類,遇到了一些問題,想問問大家有沒有好的方法。為了節省時間,我只採取了部分數據來跑演算法(全部數據跑了之後的結果和這個差不多)
訓練集:4837 documents
測試集:2074 documents
樣本比例:正樣本:負樣本 = 1:3
預測結果中,有的演算法在正樣本中預測的精確率還行(0.95-1.00之間),但是召回率非常差,通常只有0.01和0.02左右,KNeighbors和DecisionTree的精確率和召回率都是0,只有NaiveBayes和BernoulliNB的PR和Recall比較平均,但是也沒有到0.8。
問題:我查了一下那些召回率較低(0.01)的演算法,475個樣本中(正樣本),實際上只有5個被預測正確了的,但是具體原因沒有查出來。
我想請問一下:1.召回率低是因為樣本極度不平衡造成的嗎?(雖然我認為1:3的比例不算極度不平衡。)2.在這種樣本不平衡的問題上,有沒有什麼好的方法可以提高召回率?我試過SMOTE方法(過采樣和欠采樣都有試過),但對於我的數據集並沒有什麼好的效果,不止到有沒有有什麼好的方法可以解決這個問題?謝謝!
添加評論
分享
查看全部 11 個回答
0贊同反對,不會顯示你的姓名
Elvin 全是細枝末節,做一個樂於分享的人
兩個問題一並回答一下,根據你的描述,我覺得問題應該不是出在正負樣本比上,1比3這個比例不但不是非常不均衡,相反在我看來已經是非常均衡了。以前做比賽有處理過正負比1比10000的數據,我覺得這才叫不平衡,才需要使用類似上采樣,下采樣,以及SMOTE演算法(都用過),而且這樣的情況下recall,F1等指標的提升是顯著的。我覺得正負比例在1:1至1:100間差別都不會太大,需要根據具體問題做離線交叉驗證去找到最好的比例。
所以我建議你不用再糾結正負樣本比的問題,可以再回頭看一看你的數據集,一方面看一看代碼是否有誤?數據集是否太小?(總覺得你的數據集太小,而且測試集相對於訓練集太大)另外訓練集,測試集的劃分是否正確?或者重新劃分一下訓練測試集做一下交叉驗證看一看各項指標再具體研究。
J. 如何引導學生理解算理提升演算法
首先,「課標」右「一些操作」有新的課程標准中數學課程明確提出什麼新的要求,學生應注重計算能力的發展。計算能力是開展主要業務依照法律和算術的正確規律的能力。培養學生理解算術運算操作員管理,尋求合理的方法來解決簡單的算術問題的能力。而在「課標解讀,」還強調,「應該淡化計算能力的要求,選擇計算精確的計算結果得到正確的方法,比熟練操作更重要。要注意學生是否理解的操作事實上,無論操作的結果可以准確地獲得,而不是單純看操作的速度。「使這個目標要求教師在教學操作的數量,而不僅僅是專注於算術技能的學生的掌握,同時也注重學生易懂的例子,掌握演算法的學習過程,也就是把重點放在教學和演算法將被視為有機合理的組合,從而培養學生的計算能力。學習過程的流程是算術邏輯思維能力的數量的發展,存在的計算概念的數目之間,性質,規則,公式內在的聯系,有嚴格的邏輯。每個概念的引入和確立,自然,規則,公式,經過抽象,概括,思維過程判斷,推理。學生學習,了解和掌握「一些操作」的內容,從具體經過抽象,從感性到理性的過程,學生甚至從一般的演繹到了特定的處理後把這些付諸實踐去。因此,算術學習有利於培養學生的思維能力發展的數量。這就要求教師在教學過程中不僅關注結果,方法是更多地關注關注得到結果,獲得思維過程的方法,了解學生的思維過程被認為是合理的,掌握了演算法的過程。學生還在想著為主視覺形象,而認為合理,演算法,是非常抽象的,因此如何結合的處理學生良好的思維教學算術運算處理和演算法,常常教導謊言的難度之間的關系的特點。我們可以結合學生的年齡特點通過有趣的童話場景的手段,具有直觀的模型,與學生已有的知識基礎和生活,關系管理和演算法來處理算術運算的教學經驗。二,(一)通過有趣的童話場景,管理和演算法之間的關系來處理算術運算的教學手段。學生,尤其是年齡較小的學生,誰更直觀思維,從而創造有趣的童話場景,不僅調動他們學習得很好上進心,能夠更好地幫助他們了解一個童話場景中的實例,掌握演算法的幫助。北京小學教師在教學洪煒以「進位加法器20或更少,」一課是為學生創造學生車童話般的場景(PPT)一個可愛的小動物。首先魏感受到教師對學生在車上幫九小動物,審查十加幾的港口運營商,學生的積極性一下子就被調動起來了,因為他們能夠使用學到的知識的第一站幫助小動物快樂。然後再通過第二站,以幫助五小動物,汽車檢討甚至加拿大,並問:「什麼是一個很好的方式,讓我們再次考慮快?」讓學生感受到第一刮「十」重新計數「十加幾」快速和容易理解「進位加」做一個計數孕伏的原因。 5個小時的動物車後,並在9小動物第一站在一起,然後在船上的小動物的總數?這導致了9 +5 =?進位加法器。如何計算9 +5 =?學生結合生動,具體的現實情境很快想到5成1和4,1和9組成的10,10加4等於14。因此,學生在輕松,愉快的童話上下文,理解和成功掌握進加算理和演算法。通過這節課我們看到魏老師能好發年齡與學生和他們的思維特點的心理需求結合起來,創造有興趣的同學,最喜歡的童話場景,讓枯燥的數學變得有趣,讓抽象的操作符變為直觀的圖像處理,從而學生在掌握自然的演算法成功地懂事。 (b)與理由和演算法來處理算術運算的教學之間的關系的直觀模型。在皇城根小學施東酶老師的「兩位數乘兩位數,」小學三年級老師的歷史課結合學生的思維特點,具有直觀的模型,以更好地處理的管理者和經營者之間的關系演算法。歷史教師在這個類就不必寫「垂直」作為教學的終極目標,但學生已經能夠掌握垂直引導學生的基礎上,初步核算方法,探索方法背後的真相。並為學生提供一個直觀的想法映射作為研究材料,在研究中,學生們提出了多種結果。而學生的法律是不相同的,但「第一分鍾後一起」的想法是一樣的,這也正是其基本思想?垂直乘法運算。在此之後,教師觀念的歷史將被再次分割,四個句子挺拔身材被相應的公式,引導學生一步一步地計算每一個細節背後的真相的垂直深度的了解。 「圖的想法」是不是只有活動的積累,為學生創造一個寶貴的機會去體驗,同時也讓學生來幫助視覺模型,並更好地理解兩位數乘法演算法背後的真相。在我們以前的教學中,很多教師不重視或引導學生去探索計算,或只是探索方法時,學生的學習引導學生立刻直立,直立於學生的各個方面後,並沒有真正理解操作開始的過程追求計算方法的情況下。這很可能導致學生沒有真正理解判例法要靠記憶的獲得方法與技能的真理。這顯然是不利於學生的發展,歷史老師恰恰是這一課的學生真,扎扎實實地通過認識的過程提供了一個新鮮和典型案例。在教學中,教師要捨得花時間,讓學生有機會體驗,有機會體驗,有機會明白,有機會創造。新課程標准也明確指出,學生活動的經驗,其背後深意的目標,還需要廣大教師在實踐中,他們的大腦,挖掘,潛心感悟。 (c)與學生已有的知識和生活經驗,關系管理和演算法來處理算術計算教學的基礎。北京小學老師平安一直在「小數加減法」,在這節課老師一節課是幫助學生掌握的知識基礎和生活經驗,幫助學生理解基本原理小數加法和減法運算符。老師要求學生在自主系列的稱號,這已編制一個學生出了0.8 +3.74 =這個類型將揭示「小數點對齊」,是本節課的重點是十進制減法演算法時一個重要的總結。為了讓學生有機會體驗到認知動員現有的整數加減法,經驗判斷,推理,抽象思維過程中,教師讓學生自己嘗試做每一個,並解釋他們的理由這樣做。老師:你已經做了很多的加法和減法的問題,無一例外,都與底部的兩個數字對齊,可以使這個問題你為什麼不這樣做的底部?生:最後一個是位整數,它是有點底對齊對齊。小數不一定是相同的最後一個,這不是底部對齊。老師:即使你沒有對齊的底部,但誰對齊?健康:小數點對齊,這是相同的數字對應。老師:你看到了深刻,非常准確,一定會有一個理由這樣做。為什麼一定要在小數點可對齊到相同的數字對齊呢?生1:如果你不對齊的計算錯誤。生2:如果你不把小數點對齊,而底部對齊,然後八等分和百分比4對齊,然後相加肯定是不正確的。生3:嗯,我,例如,如買兩件事情,一個是0.8元,3.74元到另一個,如果8和4之和的最後一位數字,是8加4個點的角度,那肯定是錯的。老師:我們研究了同樣的問題可以從不同的角度進行研究,例如,可以講真話,你也可以,例如孩子。就在這個問題上,也有學生認為,我們都熟悉來解釋簡單的事情了「金錢」的例子說明深刻的道理,你真棒。似乎能夠計數加減單位只數相同。小結:原來和整數加減法似乎不太一樣了「十進制對齊」其實和「底部對齊」,是確保「相同的數字對齊」,而位相同數量的對准後面的真相是「同一罪名的數量直接減法。」你不僅找到了一種方法,更要了解此方法背後的數學道理,真是太好了。什麼占據了小數加減法在小學的位置「數與代數」的學習領域?如何把握其與整數加減法的關系?在本課中,應該如何展現知識的本質,把握教學的核心概念?老師的教學實踐在平回答上面的問題。教師引導學生探索小數加減法的計算方法的過程中,始終抓住教學知識課實施的「靈魂」,她並沒有滿足學生正確地計算出結果,而是通過循序漸進的方式向縱深一步引導學生的數學本質的理解。激發學生的十進制數的加法和減法的意義來計算的深刻理解,即:十進制整數加法和減法減法是一致的性質和意義,那就是,相同的數加法和減法。因此,「不合理」和「明法」的有機結合,使學生了解基本原理的基礎上,匯總計算演算法有助於學生的數學的核心概念有更深的了解,能夠更好地實現「根據法律的學生和法律行為能力的計算操作正確。「的目標。第三,「一些操作」教學建議(一)處理直觀的操作管理演算法的抽象關系。原因是不容易理解,通過現實生活中,直觀的地圖,如學生已有的知識基礎的學生和教師,幫助學生理解。 (二)處理的多樣性和演算法優化演算法的關系。演算法多樣化,注重學生的個性,學生可適當以這樣的方式,讓學生更喜歡另一種方法,但其背後的道理是一樣的,老師發現通過不同的方式來讓學生理解的方式這個道理讓學生更有效地學習數學。 (三)關系處理和思維能力的訓練。這不是一個簡單的,機械的,做題量的積累,在這個過程中,我們應著眼於幫助學生獲得經驗和發展思路。 (四)生活和重點解決的問題聯系在一起的計算。