半月沒(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編程)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注