Re: [wizs] 字串比大小程式

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間17年前 (2009/02/10 20:58), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/4 (看更多)
※ 引述《cloderw (漫雲端)》之銘言: : sort_array 本身是不斷地帶入陣列中的兩個元素做比對 : 因此若陣列元素有 N 個,sort_names 就會被執行 N x N-1 次(不跟自己比較) : 也因此陣列元素數量愈多,sort_array 效能就會大符下降 : 因此在撰寫 sort_names 等比較函式時,必須盡量的最佳化 : 單就排序玩家名稱的部份,若想進一步提高效率 : 可以先用 map() 這個 efun 將所有玩家的名稱一次 query 出來 : 建立一個存滿所有玩家名稱的字串陣列 allnames : string *allnames = map(users(), (: $1->query("name") :)) 聖殿比較少用到這個(我也沒用過:p),上面的東西類似底下.. mixed usr=users(),allnames=({}); object ppl; foreach(ppl in usr) allnames+=({ ppl->query("name") }); 或者用這個... mixed allnames=users(); int i,j; object ppl; for(i=0,j=sizeof(allnames);i<j;i++) { ppl=allnames[i]; allnames[i]=ppl->query("name"); } clode 提供的部份只用一行解決,簡潔很多^^ mixed *map_array( mixed *arr, string fun, object ob, mixed extra, ... ); (在上面的例子下使用 map = 使用 map_array) 如果看不懂上面就跟 sort_array 對照看.. mixed *sort_array( mixed *arr, string fun, object ob ); 類推一下.. (不過 (: :) 這個我之前怎麼看都看不懂哩,哈哈...) : 然後再將 allnames 丟進 sort_array 排序 : 如此就可以馬上減少 sort_names 中 N x N-1 次的 ob->query() 執行 : 假設 N = 100, 每次執行 sort_names 所損耗的執行時間為 1ms : 這樣做馬上就可以減少 100x(100-1)*1ms = 9900ms = 9.9sec : 可以大幅提升效能(當然 sort_names 應該不會花到 1ms 那麼誇張啦..XD) : 另外單純比對字串的話 : 可以直接使用 strcmp() 這個 efun 來取代自己寫的 sort_names 函式 : 但 strcmp 只能單純依照固定的字母順序排序,缺乏變化 : 需要特殊條件的排序就還是得自己撰寫 sort_names 函式 : 像是名稱中包括色碼等隱藏碼,就會需要另外進行過濾處理 : 僅供參考... 呵,之前太懶沒有先確定 mud 有沒有 strcmp 函數,才想說自己寫, sort_names 經改寫後如下.. int sort_names(string a1,string a2) { return strcmp(a1,a2); } Laechan -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.170.110.15 ※ 編輯: laechan 來自: 218.162.98.7 (02/11 07:52)
文章代碼(AID): #19aNeAIk (mud_sanc)
討論串 (同標題文章)
文章代碼(AID): #19aNeAIk (mud_sanc)