作者laechan (小太保)
看板mud_sanc
标题Re: [wizs] 字串比大小程式
时间Tue Feb 10 20:58:48 2009
※ 引述《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)