程序员都应该精通的六种算法,你会了吗?

对于一名优秀的程序员来说,面对一个项目的需求的时候,一定会在脑海里浮现出最适合解决这个问题的方法是什么,选对了算法,就会起到事半功倍的效果,反之,则可能会使程序运行效率低下,还容易出bug。因此,熟悉掌握常用的算法,是对于一个优秀程序员最基本的要求。


那么,常用的算法都有哪些呢?一般来讲,在我们日常工作中涉及到的算法,通常分为以下几个类型:分治、贪心、迭代、枚举、回溯、动态规划。下面我们来一一介绍这几种算法。


一、分治算法


分治算法,顾名思义,是将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。


分治算法一般分为三个部分:分解问题、解决问题、合并解。

分治算法适用于那些问题的规模缩小到一定程度就可以解决、并且各子问题之间相互独立,求出来的解可以合并为该问题的解的情况。


典型例子比如求解一个无序数组中的最大值,即可以采用分治算法,示例如下:


def pidAndConquer(arr,leftIndex,rightIndex):

if(rightIndex==leftIndex+1 || rightIndex==leftIndex){

return Math.max(arr[leftIndex],arr[rightIndex]);

}

int mid=(leftIndex+rightIndex)/2;

int leftMax=pidAndConquer(arr,leftIndex,mid);

int rightMax=pidAndConquer(arr,mid,rightIndex);

return Math.max(leftMax,rightMax);


二、贪心算法


贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。


贪心算法的基本思路是把问题分成若干个子问题,然后对每个子问题求解,得到子问题的局部最优解,最后再把子问题的最优解合并成原问题的一个解。这里要注意一点就是贪心算法得到的不一定是全局最优解。这一缺陷导致了贪心算法的适用范围较少,更大的用途在于平衡算法效率和最终结果应用,类似于:反正就走这么多步,肯定给你一个值,至于是不是最优的,那我就管不了了。就好像去菜市场买几样菜,可以经过反复比价之后再买,或者是看到有卖的不管三七二十一先买了,总之最终结果是菜能买回来,但搞不好多花了几块钱。


典型例子比如部分背包问题:有n个物体,第i个物体的重量为Wi,价值为Vi,在总重量不超过C的情况下让总价值尽量高。每一个物体可以只取走一部分,价值和重量按比例计算。

贪心策略就是,每次都先拿性价比高的,判断不超过C。


三、迭代算法


迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程。迭代算法是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。最终得到问题的结果。


迭代算法适用于那些每步输入参数变量一定,前值可以作为下一步输入参数的问题。


典型例子比如说,用迭代算法计算斐波那契数列。


四、枚举算法


枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。枚举法的本质就是从所有候选答案中去搜索正确地解。

枚举算法适用于候选答案数量一定的情况。


典型例子包括鸡钱问题,有公鸡5,母鸡3,三小鸡1,求m钱n鸡的所有可能解。可以采用一个三重循环将所有情况枚举出来。代码如下:



五、回溯算法


回溯算法是一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。


典型例子是8皇后算法。在8 8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。


回溯法是求解皇后问题最经典的方法。算法的思想在于如果一个皇后选定了位置,那么下一个皇后的位置便被限制住了,下一个皇后需要一直找直到找到安全位置,如果没有找到,那么便要回溯到上一个皇后,那么上一个皇后的位置就要改变,这样一直递归直到所有的情况都被举出。


六、动态规划算法


动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。


动态规划算法适用于当某阶段状态给定以后,在这阶段以后的过程的发展不受这段以前各段状态的影响,即无后效性的问题。


典型例子比如说背包问题,给定背包容量及物品重量和价值,要求背包装的物品价值最大。




  • 绋嬪簭鍛橀兘搴旇绮鹃氱殑鍏绠楁硶,浣浼氫簡鍚?
    绛旓細涓夈佽凯浠g畻娉 杩唬娉曚篃绉拌緱杞硶锛屾槸涓绉嶄笉鏂敤鍙橀噺鐨勬棫鍊奸掓帹鏂板肩殑杩囩▼銆傝凯浠g畻娉曟槸鐢ㄨ绠楁満瑙e喅闂鐨勪竴绉嶅熀鏈柟娉曪紝瀹冨埄鐢ㄨ绠楁満杩愮畻閫熷害蹇侀傚悎鍋氶噸澶嶆ф搷浣滅殑鐗圭偣锛岃璁$畻鏈哄涓缁勬寚浠(鎴栦竴瀹氭楠)杩涜閲嶅鎵ц锛屽湪姣忔鎵ц杩欑粍鎸囦护(鎴栬繖浜涙楠)鏃讹紝閮戒粠鍙橀噺鐨勫師鍊兼帹鍑哄畠鐨勪竴涓柊鍊笺傛渶缁堝緱鍒伴棶棰...
  • 鍏绋嬪簭鍛瀹炵敤绠楁硶鎺ㄨ崘锝
    绛旓細绠楁硶浜: 鍫嗘帓搴忕畻娉 鍫嗘帓搴(Heapsort)鏄寚鍒╃敤鍫嗚繖绉嶆暟鎹粨鏋勬墍璁捐鐨勪竴绉嶆帓搴忕畻娉曘傚爢绉槸涓涓繎浼煎畬鍏ㄤ簩鍙夋爲鐨勭粨鏋勶紝骞跺悓鏃舵弧瓒冲爢绉殑鎬ц川:鍗冲瓙缁撶偣鐨勯敭鍊兼垨绱㈠紩鎬绘槸灏忎簬(鎴栬呭ぇ浜)瀹冪殑鐖惰妭鐐广傚爢鎺掑簭鐨勫钩鍧囨椂闂村鏉傚害涓篛(nlogn)銆傜畻娉曚笁: 褰掑苟鎺掑簭 褰掑苟鎺掑簭(Merge sort锛屽彴婀捐瘧浣:鍚堝苟鎺掑簭)鏄缓绔...
  • 澶у閲绋嬪簭鍛蹇呴』鎺屾彙鐨勬牳蹇绠楁硶
    绛旓細鍒嗘不鎺掑簭:蹇熸帓搴忋佸綊骞舵帓搴(蹇呭锛屽揩閫熸帓搴忚繕瑕佸叧娉ㄤ腑杞寸殑閫夊彇鏂瑰紡)鍒嗛厤鎺掑簭妗舵帓搴忋佸熀鏁版帓搴 鏍戠姸鎺掑簭:鍫嗘帓搴(蹇呭)鍏朵粬:璁℃暟鎺掑簭(蹇呭)銆佸笇灏旀帓搴 鍥捐绠楁硶 鍥剧殑琛ㄧず:閭绘帴鐭╅樀鍜岄偦鎺ヨ〃 閬嶅巻绠楁硶:娣卞害鎼滅储鍜屽箍搴︽悳绱(蹇呭)鏈鐭矾寰勭畻娉:FLOYD,DIJKSTRA(蹇呭)鏈灏忕敓鎴愭爲绠楁硶:PRIM锛孠RUSKAL(蹇呭)瀹為檯...
  • 绋嬪簭鍛蹇呴』鎺屾彙鍝簺绠楁硶?
    绛旓細绠楁硶鎬濇兂锛氳椽蹇冦佸姩鎬佽鍒掑拰鍒嗘不锛岃繖浜涘熀鏈殑绠楁硶鎬濇兂鑳借浣犲湪闂瑙e喅涓父鍒冩湁浣欙紝璁╁鏉傞棶棰樼畝鍖栧鐞嗐鎺掑簭涓庢悳绱锛氭帓搴忕畻娉曞鍐掓场銆佸揩閫熷拰褰掑苟锛屾悳绱㈢畻娉曞骞垮害浼樺厛鍜屼簩鍒嗘煡鎵撅紝杩欎簺鏄暟鎹鐞嗙殑鏍稿績鐜妭銆瀛楃涓插鐞锛氫粠BM銆並MP鍒癇F鍜孠MP锛屽瓧绗︿覆鍖归厤绠楁硶鏄枃鏈鐞嗙殑閲嶈宸ュ叿銆傜嚎鎬ц〃鎿嶄綔锛氬浼氬幓閲嶃佹煡...
  • 绋嬪簭鍛蹇呴』鎺屾彙鍝簺绠楁硶?
    绛旓細蹇呴』瑕佹帉鎻¤兘鏈夌唺鐚溂鐨绠楁硶鏈锛佽涓嶅氨鏄竴涓笉鍚堟牸鐨绋嬪簭鍛
  • 绠楁硶鍜岃蒋浠剁殑鍏崇郴,绋嬪簭鍛樺簲璇瀛︿範鍝簺绠楁硶
    绛旓細涓.鍩烘湰绠楁硶:鏋氫妇. (poj1753,poj2965)璐績(poj1328,poj2109,poj2586)閫掑綊鍜屽垎娌绘硶.閫掓帹.鏋勯犳硶.(poj3295)妯℃嫙娉.(poj1068,poj2632,poj1573,poj2993,poj2996)浜.鍥剧畻娉:鍥剧殑娣卞害浼樺厛閬嶅巻鍜屽箍搴︿紭鍏堥亶鍘.鏈鐭矾寰勭畻娉(dijkstra,bellman-ford,floyd,heap+dijkstra)(poj1860,poj3259,poj1062,poj2253,...
  • 浣滀负涓涓绋嬪簭鍛,鏈夊摢浜涘父鐢鐨勭畻娉?
    绛旓細甯哥敤鐨绠楁硶鏈夛細閫掓帹娉曘佽椽蹇冩硶銆佸垪涓炬硶銆侀掑綊娉曘佸垎娌绘硶鍜屾ā鎷熸硶 鍘熷垯锛1. 鎵庡疄鐨勫熀纭銆傛暟鎹粨鏋勩佺鏁f暟瀛︺佺紪璇戝師鐞嗭紝杩欎簺鏄墍鏈夎绠楁満绉戝鐨勫熀纭锛屽鏋滀笉鎺屾彙浠栦滑锛屽緢闅惧啓鍑洪珮姘村钩鐨绋嬪簭銆傛嵁鎴戠殑瑙傚療锛屽璁$畻鏈轰笓涓氱殑浜烘瘮瀛﹀叾浠栦笓涓氱殑浜烘洿鑳藉啓鍑洪珮璐ㄩ噺鐨勮蒋浠躲傜▼搴忎汉浜閮戒細鍐欙紝浣嗗綋浣犲彂鐜板啓鍒颁竴瀹...
  • 绋嬪簭鍛寮鍙戠敤鍒扮殑鍗佸ぇ鍩烘湰绠楁硶
    绛旓細绠楁硶鍏:DFS(娣卞害浼樺厛鎼滅储) 娣卞害浼樺厛鎼滅储绠楁硶(Depth-First-Search),鏄悳绱㈢畻娉曠殑涓绉嶃傚畠娌跨潃鏍戠殑娣卞害閬嶅巻鏍戠殑鑺傜偣,灏藉彲鑳芥繁鐨勬悳绱㈡爲鐨勫垎 鏀傚綋鑺傜偣v鐨勬墍鏈夎竟閮藉繁琚帰瀵昏繃,鎼滅储灏嗗洖婧埌鍙戠幇鑺傜偣v鐨勯偅鏉¤竟鐨勮捣濮嬭妭鐐广傝繖涓杩囩▼涓鐩磋繘琛屽埌宸插彂鐜颁粠婧愯妭鐐瑰彲杈剧殑鎵鏈夎妭鐐逛负姝傚鏋滆繕瀛樺湪鏈鍙 鐜扮殑鑺傜偣,鍒欓夋嫨...
  • 绋嬪簭鍛鎺屾彙鐨勬牳蹇绠楁硶澶у鐢熷揩鏉ュ
    绛旓細绋嬪簭鍛樻帉鎻℃牳蹇冪畻娉曡繕涓嶆敹褰 1銆佸崄澶ф帓搴忕畻娉 绠鍗曟帓搴:鎻掑叆鎺掑簭銆侀夋嫨鎺掑簭銆佸啋娉℃帓搴(蹇呭) 鍒嗘不鎺掑簭:蹇熸帓搴忋佸綊骞舵帓搴(蹇呭,蹇熸帓搴忚繕瑕佸叧娉ㄤ腑杞寸殑閫夊彇鏂瑰紡) 鍒嗛厤鎺掑簭:妗舵帓搴忋佸熀鏁版帓搴 鏍戠姸鎺掑簭:鍫嗘帓搴(蹇) 鍏朵粬:璁℃暟鎺掑簭(蹇呭)銆佸笇灏旀帓搴忓骞插崄澶х畻娉曠殑瀛︿範,鍋囧浣犱笉澶ф噦鐨勮瘽,閭d箞鎴戣繕鏄尯鎺ㄨ崘浣犲幓鐪嬩功鐨...
  • 浣滀负绋嬪簭鍛,浣犱滑閮藉杩囧摢浜涘嵃璞℃繁鍒鐨勭畻娉?
    绛旓細鎷夋櫘鎷夋柉鍙樻崲銆傚拰鍌呴噷鍙跺彉鎹紝璨屼技杩欎釜鍙槸涓涓叕寮 涓嶅彨绠楁硶銆傚弽姝e暐閮界敤灏卞浜嗭紒鎬庝箞绠楁垜閮界畻涓嶅嚭鏉 鍝笺傚氨鏄寜璁$畻鍣ㄩ兘鎸変笉瀵 浣犵煡閬撻偅绉嶇棝鍚楋紵鎵浠ヨ繕鏄啓浠g爜鍚 orz锛屽叾瀹炴垜鍙槸鍦ㄨ璁哄祵鍏ュ紡銆
  • 扩展阅读:做一个小程序多少钱 ... 程序员老了都干啥去了 ... 程序员接私活报价清单 ... 嫁给程序员的弊端 ... 初级程序员接单网站 ... 十大程序员接私活平台 ... 程序员私活一天多少钱 ... 什么程序员最吃香 ... 做程序员有前途吗 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网