国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

避免回溯方法

2019-11-17 02:53:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

避免回溯方法

半月沒(méi)來(lái)博客園,換了一份新工作,開始繁瑣的事情一大堆,實(shí)在沒(méi)閑工夫?qū)懯裁戳耍@篇大概是我半年前寫在別處的,不過(guò)我覺(jué)得是不錯(cuò)的方法,至少我個(gè)人這么覺(jué)得。回溯法是不可控的,有時(shí)候會(huì)超出我們意料之外產(chǎn)生不妙的結(jié)果,最常見(jiàn)的也就是內(nèi)存泄漏。一下是原文照搬過(guò)來(lái)的,不過(guò)是我自己寫的,我也不加出處了。(如果是引用別人的我會(huì)加上出處,咱不埋沒(méi)別人的智慧。)


  回溯方法是很容易想到,又不容易想到的,往往,我們思維更容易進(jìn)入的是回溯法。但是回溯法有著它的弊端,非常明顯的弊端是作用域內(nèi)產(chǎn)生的變量和引用在回溯法調(diào)用未完成時(shí),不能釋放(對(duì)于大部分編輯器來(lái)說(shuō),排除有著優(yōu)化能力的編輯器)。如果我們?cè)谀骋环椒ㄖ惺褂脴O多的回溯調(diào)用,在方法中不能及時(shí)的對(duì)方法作用域內(nèi)的變量和引用釋放,最終會(huì)造成內(nèi)存不足和cpu的計(jì)算負(fù)荷增大(內(nèi)存機(jī)制中可以將過(guò)剩的數(shù)據(jù)轉(zhuǎn)存到虛擬內(nèi)存、硬盤,這個(gè)就不說(shuō)了)。使用棧(隊(duì))式的循環(huán),可以輕易避免回溯法,而且棧(隊(duì))式的數(shù)據(jù)再使用之后可以很方便的拋出移除。某些時(shí)候就是這樣,一個(gè)小小的改動(dòng),可以讓一個(gè)程序在某種特定的環(huán)境中起死回生。(之前做過(guò)一個(gè)數(shù)獨(dú)運(yùn)算器的算法,后來(lái)的優(yōu)化改進(jìn)就是為了避免回溯)

  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.IO;  6   7 namespace 避免回溯方法  8 {  9     class PRogram 10     { 11         static void Main(string[] args) 12         { 13             string path = AppDomain.CurrentDomain.BaseDirectory; 14  15             List<string> fileList1 = new List<string>(); 16             FunctionHuishuo(path, ref fileList1); 17  18             List<string> fileList2 = new List<string>(); 19             FunctionQueue(path, ref fileList2); 20  21             List<string> fileList3 = new List<string>(); 22             FunctionStack(path, ref fileList3); 23         } 24  25         /// <summary> 26         /// 回溯法 27         /// </summary> 28         /// <param name="path"></param> 29         /// <param name="fileList"></param> 30         private static void FunctionHuishuo(string path, ref List<string> fileList) 31         { 32             if (true) 33             { 34                 string[] files = null; 35                 try 36                 { 37                     files = Directory.GetFiles(path); 38                 } 39                 catch { } 40  41                 if (files != null && files.Length > 0) 42                 { 43                     fileList.AddRange(files); 44                 } 45             } 46  47             if (true) 48             { 49                 string[] folders = null; 50                 try 51                 { 52                     folders = Directory.GetDirectories(path); 53                 } 54                 catch { } 55  56                 if (folders != null && folders.Length > 0) 57                 { 58                     foreach (string folder in folders) 59                     { 60                         FunctionHuishuo(folder, ref  fileList); 61                     } 62                 } 63             } 64         } 65  66         /// <summary> 67         /// 堆棧法 68         /// </summary> 69         /// <param name="path"></param> 70         private static void FunctionStack(string path, ref List<string> fileList) 71         { 72             Stack<string> stack = new Stack<string>(); 73             stack.Push(path); 74  75             while (stack.Count > 0) 76             { 77                 string dir = stack.Pop(); 78  79                 string[] files = null; 80                 try 81                 { 82                     files = Directory.GetFiles(dir); 83                 } 84                 catch { } 85  86                 if (files != null && files.Length > 0) 87                 { 88                     fileList.AddRange(files); 89                 } 90  91                 string[] folders = null; 92                 try 93                 { 94                     folders = Directory.GetDirectories(dir); 95                 } 96                 catch { } 97  98                 if (folders != null && folders.Length > 0) 99                 {100                     foreach (string folder in folders)101                     {102                         stack.Push(folder);103                     }104                 }105             }106         }107 108         /// <summary>109         /// 隊(duì)列法110         /// </summary>111         /// <param name="path"></param>112         private static void FunctionQueue(string path, ref List<string> fileList)113         {114             Queue<string> queue = new Queue<string>();115 116             queue.Enqueue(path);117 118             while (queue.Count > 0)119             {120                 string dir = queue.Dequeue();121 122                 string[] files = null;123                 try124                 {125                     files = Directory.GetFiles(dir);126                 }127                 catch { }128 129                 if (files != null && files.Length > 0)130                 {131                     fileList.AddRange(files);132                 }133 134                 string[] folders = null;135                 try136                 {137                     folders = Directory.GetDirectories(dir);138                 }139                 catch { }140 141                 if (folders != null && folders.Length > 0)142                 {143                     foreach (string folder in folders)144                     {145                         queue.Enqueue(folder);146                     }147                 }148             }149         }150     }151 }
以碼當(dāng)先

請(qǐng)仔細(xì)對(duì)比下三種循環(huán)結(jié)構(gòu)的寫法,特別注意下里面有用到 if(true){...} ,這種方式在某些編輯環(huán)境中可以產(chǎn)生非常美妙的效果,你造嗎?

好了,就這么多吧,實(shí)在沒(méi)時(shí)間寫新東西了。以后出貼應(yīng)該很慢了,不過(guò)會(huì)出點(diǎn)服務(wù)器集群方面的帖子,這些帖子現(xiàn)存的已經(jīng)很多,但是大部分都是視圖文字說(shuō)明,對(duì)于新手來(lái)說(shuō)很難掌握,我自己曾經(jīng)摸索的時(shí)候,可是煞費(fèi)苦心啊。它需要的條件非常苛刻,需要大量服務(wù)器、高并發(fā)訪問(wèn)、以及核心數(shù)據(jù)庫(kù)和分化數(shù)據(jù)庫(kù)策略等等,如果用一帖把它給解釋清楚,我感覺(jué)就是天方夜譚,它完全可以出成一本書,所以在一帖中講解集群使用圖文方式是最好的方式,比較全面概括,所以我沒(méi)怪過(guò)前輩們寫集群方面的知識(shí)寫的太籠統(tǒng),完全不明所以。前輩們寫這么高明的帖子是給有心人看的,他想把他的思想教給我們;我寫帖子完全是給屌絲看的,做個(gè)知識(shí)的入門引導(dǎo)吧,呵呵。(預(yù)先掌握golang,erlang編程)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 明溪县| 登封市| 米易县| 安西县| 大城县| 沿河| 永寿县| 克东县| 汉阴县| 岳普湖县| 二连浩特市| 乌拉特前旗| 五大连池市| 龙口市| 彩票| 浑源县| 精河县| 麻栗坡县| 宁南县| 金溪县| 宜兰市| 大余县| 中西区| 安阳市| 平罗县| 汾西县| 延吉市| 望谟县| 灵武市| 小金县| 大邑县| 梨树县| 文昌市| 中江县| 克什克腾旗| 晋城| 分宜县| 清镇市| 秦皇岛市| 普安县| 莱州市|