亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 8012 | 回復(fù): 13
打印 上一主題 下一主題

[算法] 如何用C實現(xiàn)這樣一個索引算法? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-04-25 09:28 |只看該作者 |倒序瀏覽
本帖最后由 xlwang_0903 于 2013-04-25 14:18 編輯

最近開始學(xué)習(xí)C語言,有一個問題需要解決,還請大家?guī)兔Τ龀鲋饕。我先把需要解決的問題描述一下:
        讀取文本文件,小到幾十K,大到十幾G,內(nèi)容為基因序列字符串,包括基因的id、描述及其對應(yīng)的序列(也就是由AGCT四種字符組成的文本內(nèi)容),F(xiàn)在想對這個文件做索引以便搜索。如果待查詢的字符串長度為K,那么我需要得到    這個文件中所有的長度為K的子串的位置以及子串所屬的基因(包括基因id等信息),然后寫入mysql。

不知道有沒有比較好的算法能做這個事情,或者請大家?guī)臀姨崽崴悸罚視S時關(guān)注大家的回復(fù),謝謝!

呃……我補(bǔ)充一下,好像我沒有說明白。實際我是要在一個文件中查詢某個字符串是否存在并得到這個字符串的位置信息。字符串的長度相對固定。

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
2 [報告]
發(fā)表于 2013-04-25 09:37 |只看該作者
你還是舉個例子來說明比較好

論壇徽章:
0
3 [報告]
發(fā)表于 2013-04-25 09:51 |只看該作者
hellioncu 發(fā)表于 2013-04-25 09:37
你還是舉個例子來說明比較好


比如文件的內(nèi)容如下:
>0
AGCAGGGGGGCTTATTATTACCCCCCCTGCTCGGGGCGGGACATTCTGTG
ATGGGCTGGGCTTTATGCGGCCAAATAAGCCCATAAAGCCAGATCTGGGC
CCATTTAAGGGCCCGTGGTTTGAAAATGTCGCGTTCCCGCCTAA
……
>1
……
>2
我要查詢所有長度為k的子串的位置,例如查詢AAGCCCA(k=7),把這個子串的所有位置信息找出來,并且要知道這個子串是在>0對應(yīng)的序列上,還是在>1對應(yīng)的序列上。

論壇徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
4 [報告]
發(fā)表于 2013-04-25 10:03 |只看該作者
看了例子才發(fā)現(xiàn)和我想的完全不一樣..
讀取每個基因,然后看輸入的字串是否在這個基因的序列里,是的話就插入數(shù)據(jù)庫了..
是否在基因序列里可以用kmp.

論壇徽章:
0
5 [報告]
發(fā)表于 2013-04-25 10:13 |只看該作者
pandaiam 發(fā)表于 2013-04-25 10:03
看了例子才發(fā)現(xiàn)和我想的完全不一樣..
讀取每個基因,然后看輸入的字串是否在這個基因的序列里,是的話就插入 ...


我的想法是先對文件做個索引保存到數(shù)據(jù)庫,待查詢的序列是到數(shù)據(jù)庫中去查。我是想知道建索引的過程有沒有比較好的方法。另外你說的kmp是什么意思?

論壇徽章:
44
15-16賽季CBA聯(lián)賽之浙江
日期:2021-10-11 02:03:59程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-02 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-04-25 10:55:452016科比退役紀(jì)念章
日期:2016-04-23 00:51:2315-16賽季CBA聯(lián)賽之山東
日期:2016-04-17 12:00:2815-16賽季CBA聯(lián)賽之福建
日期:2016-04-12 15:21:2915-16賽季CBA聯(lián)賽之遼寧
日期:2016-03-24 21:38:2715-16賽季CBA聯(lián)賽之福建
日期:2016-03-18 12:13:4015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-05 00:55:2015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-04 21:11:3615-16賽季CBA聯(lián)賽之天津
日期:2016-11-02 00:33:1215-16賽季CBA聯(lián)賽之浙江
日期:2017-01-13 01:31:49
6 [報告]
發(fā)表于 2013-04-25 10:19 |只看該作者
本帖最后由 windoze 于 2013-04-25 10:22 編輯

MySQL中按子串查找(LIKE '%xxx%')的速度會很慢,一個簡單的思路是把每個序列中的每個堿基單獨建立倒排鏈并保存位置,這樣在查詢時只需要按照單個堿基做phrase query。這么做的缺點是,因為堿基只有4個,每個倒排鏈都會很長,查詢效率只能說比LIKE略高。
一個優(yōu)化一點的方案是N Gram,也就是把堿基序列切分成長度為N的片段,例如“GCTTAT”的2Gram切分就是GC,CT,TT,TA,AT,3Gram就是GCT,CTT,TTA,TAT,每個切片的位置前進(jìn)一位,你可以對序列做一個1~N的切片,也就是按照單個堿基切分一遍,按照2Gram切分一遍,按照3Gram切分一遍…………然后針對所有這些切片建立倒排鏈。
查詢時,如果要查詢的序列長度大于預(yù)先建立好的索引中最大的N,則需要將查詢序列按照最大的N做一個NGram切分,將所有的切分片段做一個AND query,在這個結(jié)果集中再做單個堿基的phrase query,或者直接查找子串,因為你的查詢序列是已知的,所以可以用KMP預(yù)先建立跳轉(zhuǎn)表,速度會比較快。
這個過程的作用是確保沒有false positive,因為NGram AND query并不能確保得到的結(jié)果集一定準(zhǔn)確。
這樣做的缺點是N越大,索引就會越大,但是N越大查詢的速度就會越快。

論壇徽章:
0
7 [報告]
發(fā)表于 2013-04-25 10:50 |只看該作者
windoze 發(fā)表于 2013-04-25 10:19
MySQL中按子串查找(LIKE '%xxx%')的速度會很慢,一個簡單的思路是把每個序列中的每個堿基單獨建立倒排鏈并保 ...


我現(xiàn)在的想法有點類似與您說的N Gram。因為待查詢的字符串長度K相對固定,所以我想做索引時取的N就等于K。我把所有長度為K的子串的位置直接保存到數(shù)據(jù)庫。

論壇徽章:
44
15-16賽季CBA聯(lián)賽之浙江
日期:2021-10-11 02:03:59程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-02 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-04-25 10:55:452016科比退役紀(jì)念章
日期:2016-04-23 00:51:2315-16賽季CBA聯(lián)賽之山東
日期:2016-04-17 12:00:2815-16賽季CBA聯(lián)賽之福建
日期:2016-04-12 15:21:2915-16賽季CBA聯(lián)賽之遼寧
日期:2016-03-24 21:38:2715-16賽季CBA聯(lián)賽之福建
日期:2016-03-18 12:13:4015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-05 00:55:2015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-04 21:11:3615-16賽季CBA聯(lián)賽之天津
日期:2016-11-02 00:33:1215-16賽季CBA聯(lián)賽之浙江
日期:2017-01-13 01:31:49
8 [報告]
發(fā)表于 2013-04-25 11:19 |只看該作者
回復(fù) 7# xlwang_0903

如果K基本固定,那你就可以直接針對這些長度做NGram切分然后建立索引。
但有一個問題要注意,索引并不適合存到MySQL里,因為索引本身是一個keyword->document_id_list的映射表,MySQL并不能充分優(yōu)化這種特定的場景。
建議你找一個專門的search engine干這事,比如Lucene、Xapian,或者…………給自己做個廣告…………Argos…………

論壇徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46處女座
日期:2013-10-24 14:25:01酉雞
日期:2014-04-07 11:54:15
9 [報告]
發(fā)表于 2013-04-25 11:21 |只看該作者
建一個后綴樹就可以了, 10+G的文件建完也用不了1,2個G, 內(nèi)存里只存后綴數(shù)以及文件偏移索引.

論壇徽章:
2
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
10 [報告]
發(fā)表于 2013-04-25 12:23 |只看該作者
這種算法應(yīng)該很簡單,就是順序從txt文件中讀取每個記錄,然后比對。符合要求就寫入MySQL中。
只是需要一個比較大的緩沖區(qū),足以容下最大的記錄。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP