日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

算法問題匯總

算法與數(shù)據(jù)結構 ? 來源:算法與數(shù)據(jù)結構 ? 2020-05-06 11:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

講一講到底如何“解決問題”,本文非常非常非常重要,是我很長一段時間的心血與積累,大家一定要耐心看完,共包含3節(jié):

算法對個人的意義

解決問題的策略

算法問題匯總

01 PART 算法對個人的意義

在實際項目中,算法的使用場景有很多,如“Java8中Hashmap使用紅黑樹來實現(xiàn)”、“Redis底層使用LRU來進做淘汰策略”、“大數(shù)據(jù)領域很多問題都基于TopK”、“JS原型鏈里使了類似鏈表的成環(huán)檢測”、“特別復雜的業(yè)務邏輯經(jīng)常涉及到DAG”、“MySql為什么索引要用B+樹”、“Oracle里的開窗函數(shù)如何實現(xiàn)” 等等等等,這些今天我們統(tǒng)統(tǒng)不談。而我,更多的是想和大家聊一聊,算法對個人有什么意義?

市面上大部分的算法書籍,第一章介紹算法,都會給大家列一列類似上面的那些話,或者就是使用?;蜿犃衼碜鲆粋€引子,告訴大家算法很重要,你得需要去學,吧啦吧啦....但是不知道大家有沒有想過這樣一個問題,算法對于個人而言到底有什么意義呢?如果這個問題大家陌生,那你一定會聽到有寫了幾年業(yè)務邏輯的老程序員,說過“我這些年從來沒有用過算法,除了出去面試的時候”之類的話。其實,我這里真想說一句臟話,這些思想真的是TMD害人不淺啊。甚至我懷疑大多數(shù)說這句話本身的人,有兩種:一種就是嚴重缺乏自信心,覺得自己一輩子都沒辦法學好算法了,所以就這樣吧。第二種就是故意誤人子弟,驅動來源于自己不會,方式采用侃大山,反正忽悠一個是一個,再來身邊也沒有其他這方面厲害的朋友,說完之后自己都沒意識到哪里有問題,卻對別人帶去很不好的影響。所以如果你今天看到我的這篇文章,我希望你能記住一世,這輩子都不要說出這種類似的話來,保持對這個學科基本的尊重,哪怕多一點點匠心精神。算法對個人的意義如下:

算法題目的程序規(guī)模大多都是比較小的,也就意味著切入點很小。使得每一個做題人,可以最大化的投入時間研究問題的本身。而在工作中,稍大一點的項目,基本上是沒辦法隨意改變代碼結構的,甚至還會為了整體性能犧牲程序的簡潔與優(yōu)雅。所以算法題是可以讓你通過練習編寫出好代碼的最好的方式,沒有之一。

算法題目中基本不會有圖形化界面,只利用文本進行輸入和輸出。你可以相當專注的去解決問題。而在工作中,你能獲得專注去研究一個問題的機會,幾乎很難。想一想,假如你用JAVA寫一個后臺功能,其核心代碼不到10行邏輯,但是MVC得占據(jù)你三分之一工作量,定義接口占據(jù)你三分之一工作量,公司假如沒前端,再占據(jù)你三分之一工作量。整個這個過程,我有一個Amazon的朋友形容的很貼切,“掏糞”。

預測能力的構建,在大多數(shù)算法練習平臺中,因為會將運算時間和內(nèi)存使用狀況等信息實時提供給做題人,所以做題人甚至可以一邊修改代碼,一邊觀察修改對程序產(chǎn)生的影響。這個是不得了的,在工作中,絕對不可能有這樣的機會。而在這個過程中,做題人可以提高對邏輯結構復雜程序進行性能預測的能力,該能力將伴隨其一身。

提升coding能力的最好方式。假如我們打王者榮耀,你要上王者,不開排位,一直打電腦,能上的去嗎?在工作中,你來回接觸的就那么幾個人,有幾個能寫出特別優(yōu)秀的代碼,見到了,那說明老天眷顧你,大部分人都見不到。但是在算法平臺的練習中,基本上我們每一個問題,我們都能看到全世界最優(yōu)秀的人提交的代碼。沒有對比,雖然不成傷害,卻更難成為進步!只有我們?nèi)ラ喿x別人優(yōu)秀的邏輯,讀懂別人思考的過程,與全世界頂尖的程序員編寫代碼的能力進行比較,才可以成為真正的大牛。

算法題讓你難受。用腳指頭想一個問題,在各行各業(yè)中,想成為其行業(yè)的佼佼者,是不是一定有一個難受的過程。假如天天寫CRUD,并且還得意洋洋,我用一套Generator生成只需要5分鐘,其他時間就可以打打爐石,勾搭勾搭妹子。不經(jīng)歷一個難受的過程,如何可以進步?就連郭德綱出名之前,也在玻璃窗里被關過兩天兩夜。羅馬不是一天建成的,但是如果不修,那就永遠建不成。難受就是真理,說明你正在進步。

單測都是“騙人的”。請大家不要高估工作中QA的能力(當然,也有牛逼的QA,我見過...),大部分的公司里,QA來做單測時,基本上是重新走了一遍開發(fā)者的邏輯。更有甚者,開發(fā)直接說出“我寫完都已經(jīng)測完了,要QA有什么用處”,其實這并不是一個段子,因為大部分QA是做不到完美的cover業(yè)務邏輯的,換句話說,也就不可能構建出完美的測試用例測出你代碼的問題。但是算法不是,大部分的算法平臺,都提供了實時反饋的機制,如果自己編寫的代碼可以得到快速,客觀的意見反饋,這絕對是有如神助。就好像是你打王者,旁邊有個小精靈,總是會在合適的時機告訴你,“去下路,中路沒人”,“小心草叢”。那如果不被帶飛,你信嗎?

總之,正是因為算法題目中只保留了必備的要素,舍棄了其他無關緊要的部分,所以可以對每一位做題人都構建一個學習解決問題的最佳環(huán)境,而在這個環(huán)境中的成長與提高,將對一個軟件工程師的生涯產(chǎn)生深遠影響,乃至一世。所以,請大家能有一顆匠心,你可以選擇不去了解學習掌握算法,但是請不要耽誤他人進步。山高水長,江湖路遠,珍重萬千,有緣再見!

02 PART 解決問題的策略

解決簡單的問題時,直接利用已知的技術便可輕松解決問題。但是如果遇到難題,恐怕就需要用各種手段。管他是花貓野貓,抓住耗子都是好貓。在解決問題的策略構建中,我們首先要對問題和答案結構有一個直觀的感受,或者說猜測。如果可以把控住當前算法的問題,具備一個什么樣的形態(tài),然后就可以把毫無頭緒的事情,變得有跡可循。在這樣一個過程中,一點點的積累經(jīng)驗,最終就可以提升自己。

上面說的內(nèi)容,玄而又玄,那到底如何來構建策略。假如我們遇到一個問題,讓我們找一個國家鐵路網(wǎng)中,兩個城市的最短路徑。這種問題,大家肯定首先想到的就是使用迪杰斯特拉算法。但是如果問題變成“換乘火車次數(shù)少于N次,尋找最短路徑”,這種問題將不能直接套用最短路徑的算法。有時候只是改變題中條件,就可以讓整個題目完全走向另一個邏輯,這就需要大家對原算法的原理和執(zhí)行過程特別了解,并且熟讀題意。所以這里我們抽象出兩個步驟:

讀題

重構

讀題的目的,就是閱讀并理解問題。不管是是不是算法老手,在這上面栽跟頭的絕對不是一個兩個,審題不清是所有人的共性(絕不是你的個人問題),人的天性就期望可以快速得到反饋,這是身體欲望導致的,和你看到漂亮的妹子下半身豎立本質(zhì)沒有什么區(qū)別。所以這就引出我們的解決方法 - 重構。

什么是重構,重構其實就是一個抽象化的過程。借用我們已經(jīng)掌握的數(shù)學/計算機知識,將其表達成現(xiàn)實世界概念。大部分的現(xiàn)實世界概念都是比較復雜的,我們對其抽繭剝絲,保留本質(zhì),表述成易于理解的形式。而對其重構的過程,就可以決定其程序設計的方向。舉一個最簡單的例子,比如我們要用代碼實現(xiàn)一個整數(shù)平方根的開方,可以選用牛頓法或者二分法,那這兩種方法是如何被想到的。假如我們把問題重構成圖形的表達方式,就比較容易會推出牛頓法。假如我們把問題重構成已有的知識概念,自然就可以想到二分法。而如果我們把問題抽象成公式,甚至可以通過數(shù)學法來進行解題。劃重點,不同的重構方式,決定最終程序的走向。

在重構的基礎上,其實我們就可以來進行解題了。但是這里我還要對其加一個步驟,化簡。什么又是化簡,如何化簡?假如我們有一個題,我們有一個二維網(wǎng)格,里邊有N個點,兩點的距離是X坐標和Y坐標的的和。比如坐標(5,1)和(4,7)的點間距就是1+6=7。我們要找到給出的N個點距離之和最小的新點的坐標。


題目因為本身是二維的,我們寫代碼其實不是很好寫。所以我們可以將其化簡為一維。我們把每一個點的左邊,通過映射的方式,分別映射到 x軸 和 y軸。然后我們把問題轉化成在直線上尋找到給出點的距離之和最小的點。這就是化簡。萬物之始,大道至簡,至拙至美。生活中咱們也說透過現(xiàn)象看本質(zhì),放在算法里你就不會了?

讀題-重構-化簡,下來自然就是解題了。那如何解題?這個范疇雖然很大,但也不是無跡可尋,下面兩點:

基本數(shù)據(jù)結構和算法的掌握(略)

常見算法問題的匯總

基本數(shù)據(jù)結構和算法的掌握,這個自不必說,是人都知道,那么常見算法問題的匯總又是什么,我們看下一節(jié)。

03 PART 算法問題匯總

寫算法最怕什么?當然是出錯。與其重復相同的錯誤,不如從錯誤中吸取教訓。與其從自己的錯誤中吸取教訓,不如從別人的錯誤中學習經(jīng)驗。總結常見的算法問題,我總不能和你去說我們需要掌握數(shù)組、鏈表、二叉樹、Map等這些數(shù)據(jù)結構。我認為的總結,就是錯誤的總結。所以為了快速拔高大家的水準,我準備了以下這些錯誤,請一定耐心看完,反復閱讀。

遞歸,防止死循環(huán)和內(nèi)存泄露。由于遞歸需要堆棧,所以內(nèi)存消耗要比非遞歸代碼要大很多。而且,如果遞歸深度太大,可能系統(tǒng)撐不住。內(nèi)存會存在突然飆升的情況。如果是數(shù)據(jù)錯誤導致無限循環(huán),那問題就大了。所以這方面問題在開發(fā)的時候需要注意。

訪問數(shù)組越界,絕大多數(shù)的數(shù)組越界,根本原因在于對定義混淆。比如定義的時候想的是“以0起始”,但是寫的時候寫成了“以1起始”。究其根本,數(shù)組越界的問題,其實是對區(qū)間把控的問題。

區(qū)間表意不明。大部分的語言中,數(shù)組都以0為起始元素,但是人的思維習慣于以1為起始。那為什么數(shù)組要以0為起始元素,歷史原因有很多,咱不說。對咱們有用的,3個。第一,因為我們選擇左閉右開區(qū)間,比如 [0,n),我們可以很容易通過 n-0 得到數(shù)組中元素個數(shù)。這點大家要形成條件發(fā)射,看到數(shù)組,明確其個數(shù)。第二,閉區(qū)間很難去表示一個空數(shù)組,不信你試試,非常難受。第三,左閉右開的區(qū)間,迭代器只需要最少的操作符。可以讓代碼寫起來非常的舒服,STL的算法和容器中基本都是如此。

差一問題(柵欄錯誤)。建造一條直柵欄(即不圍圈),長30米、每條柵欄柱間相隔3米,需要多少條柵欄柱? 求數(shù)組 A[i]到 A[j] 的平均值,A[i] 到 A[j] 的和應該除以多少,是 j-i+1,還是 j-i?二分法中的 while 條件,到底是用 <= 還是 < ?這些都是差一問題,這類問題如何解決。利用最小的的輸入值測試代碼的執(zhí)行過程,長期反復,達到條件反射。這個過程一定是在大量的題目練習中掌握的,如果你到目前還在糾結這個問題,請先扣心自問,是否刷過至少200道算法題。如果沒有,請不要糾結,干就對了。如果有,來找我。

內(nèi)存溢出問題。分為兩種,一種是因為運算超出變量取值范圍發(fā)生的內(nèi)存溢出,比如二分法中的mid,就要使用 left+(right-left)>>1。另一種就是因為代碼不嚴謹,比如遞歸沒有退出條件,while死循環(huán),等等導致內(nèi)存溢出。

初學者定義問題。比如統(tǒng)計26個字母出現(xiàn)的次數(shù),初學者會用hashmap,其實這種已知值范圍的,定義成數(shù)組就可以了。其他類似數(shù)字0-9,每個月的天數(shù),都是一樣的

寫一半忘記題意。這個根本原因還是因為思維脈絡不清晰導致的,有時候初學者還會遇到一個問題。定義一個函數(shù),比如叫做 juge() 返回 bool 值,本來應該是判斷某條件成立時返回true,但是用的時候卻以為,在條件不成立的時候返回true,最終導致結果錯誤。

變量名錯誤。不管是和方法參數(shù)中的變量名稱沖突,還是因為本身表意不明,最終出現(xiàn)賦值錯誤,或者編譯不通過。

運算優(yōu)先級錯誤。比如位運算,各個語言中的優(yōu)先級定義是略有不同的。有時候需要加括號,有時候不需要加。

特殊值的處理。一些找規(guī)律的題目,往往在等于0,等于1的時候,規(guī)律和其他的數(shù)不同,所以這種題目,需要對這種特殊值進行特殊處理。

以上就是我挑選過的一些具有代表性的錯誤示例(后續(xù)還會補充),同時,算法指導篇我打算出一個系列,包括算法中常用技巧,常見錯誤,題目常見誤導 等等,都是我的珍藏。今天的文章嘔心泣血,希望大家可以幫我轉發(fā),我想如果你身邊有學習計算機的朋友看到,他一定會感謝你。支持我的朋友們,還沒有關注的,快點來個關注。最后,山高水長,江湖路遠,珍重萬千,下期再見!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4810

    瀏覽量

    98622
  • 數(shù)組
    +關注

    關注

    1

    文章

    420

    瀏覽量

    27483

原文標題:嘔心泣血算法指導篇(真正的干貨,怒懟那些說算法沒用的人)

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    PID控制的算法

    PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法,如果能夠熟練掌握PID算法的設計與實現(xiàn)過程,對于一般的研發(fā)人員來講,應該是足夠應對一般研發(fā)問題了,而難能可貴的是,在我所
    發(fā)表于 01-23 08:18

    C語言增量式PID的通用算法

    C語言增量式PID通用算法控制算法中PID使用的非常廣泛,但是在網(wǎng)上找代碼的時候發(fā)現(xiàn)好多代碼都不夠通用,需要自己改好多東西,而且當一個項目需要使用多個PID控制器時也頗為麻煩,這里設計一個通用的增量
    發(fā)表于 01-14 08:28

    ADC的采樣濾波算法利用卡爾曼濾波算法

    , text{δ2為測量噪聲} end{cases} { Xk+1?=Xk?+δ1?,Zk+1?=Xk+1?+δ2?,?δ1?為系統(tǒng)噪聲δ2?為測量噪聲? 2 卡爾曼濾波算法 我們知道卡爾曼濾波算法
    發(fā)表于 12-01 07:44

    單片機的算法

    平滑濾波算法 設置一個數(shù)據(jù)緩存區(qū),每新采集一個數(shù)據(jù)便存入暫存區(qū)中,同時去掉一個最老數(shù)據(jù),保存這N個數(shù)據(jù)始終是最新更新的數(shù)據(jù)。采用環(huán)型隊列結構可以方便地實現(xiàn)這種數(shù)據(jù)存放方式。 #define
    發(fā)表于 11-28 08:19

    C語言的常見算法

    # C語言常見算法 C語言中常用的算法可以分為以下幾大類: ## 1. 排序算法 ### 冒泡排序 (Bubble Sort) ```c void bubbleSort(int arr
    發(fā)表于 11-24 08:29

    8種常用的CRC算法分享

    CRC 計算單元可按所選擇的算法和參數(shù)配置來生成數(shù)據(jù)流的 CRC 碼。有些應用中,可利用 CRC 技術來驗證數(shù)據(jù)的傳輸和存儲的完整性。 8 種常用的 CRC 算法,包括: CRC16_IBM
    發(fā)表于 11-13 07:25

    SM4算法實現(xiàn)分享(一)算法原理

    SM4分組加密算法采用的是非線性迭代結構,以字為單位進行加密、解密運算,每次迭代稱為一輪變換,每輪變換包括S盒變換、非線性變換、線性變換、合成變換。加解密算法與密鑰擴展都是采用32輪非線性迭代結構
    發(fā)表于 10-30 08:10

    SM4算法原理及分享1

    SM4算法是一種分組密碼算法。其分組長度為128bit,密鑰長度也為128bit。加密算法與密鑰擴展算法均采用32輪非線性迭代結構,以字(32位)為單位進行加密運算,每一次迭代運算均
    發(fā)表于 10-30 06:54

    國密系列算法簡介及SM4算法原理介紹

    一、 國密系列算法簡介 國家商用密碼算法(簡稱國密/商密算法),是由我國國家密碼管理局制定并公布的密碼算法標準。其分類1所示: 圖1 國家商用密碼
    發(fā)表于 10-24 08:25

    加密算法的應用

    加密是一種保護信息安全的重要手段,近年來隨著信息技術的發(fā)展,加密技術的應用越來越廣泛。本文將介紹加密算法的發(fā)展、含義、分類及應用場景。 1. 加密算法的發(fā)展 加密算法的歷史可以追溯到古代。在
    發(fā)表于 10-24 08:03

    基于FPGA的CLAHE圖像增強算法設計

    CLAHE圖像增強算法又稱為對比度有限的自適應直方圖均衡算法,其算法原理是通過有限的調(diào)整圖像局部對比度來增強有效信號和抑制噪聲信號。
    的頭像 發(fā)表于 10-15 10:14 ?831次閱讀
    基于FPGA的CLAHE圖像增強<b class='flag-5'>算法</b>設計

    2025北京軟件開發(fā)公司推薦匯總:盤點10家優(yōu)秀軟件定制開發(fā)公司

    2025北京軟件開發(fā)公司推薦匯總:盤點10家優(yōu)秀軟件定制開發(fā)公司
    的頭像 發(fā)表于 09-30 09:16 ?2986次閱讀
    2025北京軟件開發(fā)公司推薦<b class='flag-5'>匯總</b>:盤點10家優(yōu)秀軟件定制開發(fā)公司

    DFT算法與FFT算法的優(yōu)劣分析

    一概述 在諧波分析儀中,我們常常提到的兩個詞語,就是DFT算法與FFT算法,那么一款功率分析儀/諧波分析儀采用DFT算法或者FFT算法,用戶往往關注的是能否達到所要分析諧波次數(shù)的目的,
    的頭像 發(fā)表于 08-04 09:30 ?1809次閱讀

    思必馳聲音復刻算法獲得深度合成服務算法備案

    近日,國家互聯(lián)網(wǎng)信息辦公室正式發(fā)布第十二批深度合成服務算法備案信息,思必馳聲音復刻算法通過此次備案。該算法能夠高精度復刻人類聲音,為個性化語音服務、智能客服、語音交互等多個領域提供強有力的技術支持。目前,思必馳已有6項
    的頭像 發(fā)表于 07-31 17:42 ?1036次閱讀

    打破壁壟,方波算法的局限與弦波算法的優(yōu)勢--【其利天下】

    目前市面上的無刷小風扇大多采用方波算法,存在噪音大等痛點。在一個星期前,弦波算法的小風扇尚未出現(xiàn),但是現(xiàn)在其利天下技術有限公司已率先布局,采用FOC算法,即弦波算法,有望打破這一局限。
    的頭像 發(fā)表于 06-21 18:02 ?873次閱讀
    打破壁壟,方波<b class='flag-5'>算法</b>的局限與弦波<b class='flag-5'>算法</b>的優(yōu)勢--【其利天下】
    三明市| 陆川县| 腾冲县| 岳阳市| 宿松县| 益阳市| 普陀区| 平遥县| 克什克腾旗| 满城县| 南郑县| 梅河口市| 澄迈县| 文山县| 古蔺县| 闵行区| 鸡西市| 德钦县| 留坝县| 石棉县| 务川| 中方县| 公主岭市| 通化市| 琼中| 高碑店市| 纳雍县| 伊宁县| 交城县| 惠东县| 英吉沙县| 泗水县| 新龙县| 新邵县| 海林市| 且末县| 通榆县| 清涧县| 五寨县| 揭西县| 玉龙|