SetupBBS 板


LINE

※ 本文轉錄自 [Daily] 看板 作者: DarkKiller (悸動) 看板: Daily 標題: Re: 在 M3 上實做 KMP-algorithm 時間: Fri Mar 18 14:04:20 2005 ※ 引述《DarkKiller (悸動)》之銘言: > 在 string matching 的演算法有幾個比較有效率的方法 O(pat + str),其中之 > 一是 KMP algorithm。 > 關於為什麼要用 KMP algorithm 以及 KMP algorithm 的演算法,請參考 DS 或 > Algorithm 書籍。 > 在 M3 上面實做不難,只要修改一些東西就可以用。 > 修改 src/lib/Makefile,增加 str_str_kmp.c 及 str_str_kmp.o,然後把下列 > 程式碼放入 src/lib/str_str_kmp.c: > /* a alternative str_str() using KMP algorithm. */ 再來是將某些使用 str_str() 的程式碼改用 str_str_kmp_tbl() + str_str_kmp()。 要讓 KMP algorithm 有效率,選擇 pattern 掃過一次以後會比對許多 string 的程式碼會比較有用。 如 src/maple/board.c 的 class_search(): if (pos) { BRD *bcache, *brd; ! int tbl[sizeof(buf) / sizeof(char) + 1]; short *chp, chn; bcache = bshm->bcache; str_lower(ptr, ptr); ! str_str_kmp_tbl(ptr, tbl); pos = num = xo->pos; max = xo->max; chp = (short *) xo->xyz; do { if (++pos >= max) pos = 0; chn = chp[pos]; if (chn >= 0) { brd = bcache + chn; ! if (str_str_kmp(brd->brdname, ptr, tbl) || str_str_kmp(brd->title, ptr, tbl)) return pos + XO_MOVE; } } while (pos != num); } 以及 src/maple/post.c 的 XoXpost(): ! int filter_author, tbl[sizeof(buf) / sizeof(char) + 1]; if ((max = xo->max) <= 0) /* Thor.980911: 註解: 以防萬一 */ return XO_FOOT; /* input condition */ key = xypostKeyword; vget(b_lines, 0, MSG_XYPOST, key, sizeof(xypostKeyword), GCARRY); str_lower(buf, key); key = buf; ! str_str_kmp_tbl(key, tbl); if (filter_author = vget(b_lines, 0, "[串接模式]作者:", author, 30, DOECHO)) { : : : /* Thor.981109: 特別注意, author是從頭match, 不是substr match, 為降低load */ if (filter_author && str_ncmp(head->owner, author, filter_author)) continue; /* check condition */ title = str_ttl(head->title); /* gslin.021023: 先把 Re: 除外 */ ! if (*key && !str_str_kmp(title, key, tbl)) continue; sum++; /* check if in table, binary check */ 及 src/maple/talk.c 的 pal_list(): case 'f': usr_fpath(fpath, cuser.userid, FN_PAL); if ((fd = open(fpath, O_RDONLY)) >= 0) { PAL *pal; char *userid; int tbl[256]; mgets(-1); ! str_str_kmp_tbl(buf, tbl); while (pal = mread(fd, sizeof(PAL))) { userid = pal->userid; if (!ll_has(userid) && (pal->userno != cuser.userno) && !(pal->ftype & PAL_BAD) && ! (!userno || str_str_kmp(pal->ship, buf, tbl))) { ll_add(userid); reciper++; } } close(fd); } ll_out(3, 0, MSG_CC); userno = 0; break; 及 src/maple/talk.c 的 ulist_search(): if (vget(b_lines, 0, msg_uid, buf, IDLEN + 1, GCARRY)) { char bufl[IDLEN + 1]; ! int buflen, tbl[sizeof(bufl) / sizeof(char) + 1]; str_lower(bufl, buf); buflen = strlen(bufl); /* Thor: 必定大於0 */ ! str_str_kmp_tbl(bufl, tbl); pos = num = xo->pos; max = xo->max; pp = ulist_pool; do { pos += step; if (pos < 0) /* Thor.990124: 假設 max 不為0 */ pos = max - 1; else if (pos >= max) pos = 0; /* Thor.990124: id 則從頭 match */ /* if (str_ncmp(pp[pos]->userid, bufl, buflen)==0 */ ! if (str_str_kmp(pp[pos]->userid, bufl, tbl) /* lkchu.990127: 找部份 id 好像比較好用 :p */ ! || str_str_kmp(pp[pos]->username, bufl, tbl)) /* Thor.990124: 可以找 部分 nickname */ { 及 src/maple/xover.c 的 xo_thread(): int tbl[256]; if (op & RS_CURRENT) { query = currtitle; ! str_str_kmp_tbl(query, tbl); if (op & RS_FIRST) { if (!strcmp(query, tag)) /* 目前的就是第一筆了 */ return XO_NONE; near = -1; } } else { title = str_ttl(tag); if (op & RS_FIRST) { if (title == tag) return XO_NONE; near = -1; } strlcpy(query = buf, title, sizeof(buf)); ! str_str_kmp_tbl(query, tbl); } : : : snprintf(query = buf, sizeof(buf), "搜尋%s(%s):", title, (step > 0) ? "↓" : "↑"); if (!vget(b_lines, 0, query, tag, len, GCARRY)) return XO_FOOT; /* Thor.980911: 要注意, 如果沒找到, "搜尋"的訊息會被清, 如果找到了, 則沒被清, 因傳回值為match, 沒法帶 XO_FOOT */ str_lower(query, tag); ! str_str_kmp_tbl(query, tbl); } : : : if (((op & RS_RELATED) && !strncmp(tag, query, 40)) || ! (!(op & RS_RELATED) && str_str_kmp(tag, query, tbl))) { if (op & RS_FIRST) { if (tag != title) { near = pos; /* 記下最接近起點的位置 */ neartop = top; continue; } } -- Resistance is futile. http://gslin.org/ & <[email protected]> -- ※ Origin: 邪惡小鹿鹿 <Deer.twbbs.org> ◆ From: deer.math.nctu.edu.tw







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP