Re: [wizs] 字串比大小程式
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間17年前 (2009/02/10 20:58)推噓0(0推 0噓 0→)留言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)
討論串 (同標題文章)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
15
19