轉(zhuǎn)自:http://www.douban.com/group/topic/14551517/中科院大博士是如何進行文獻檢索和閱讀的(好習慣受益終生) 一.如何進行文獻檢索 我是學自然科學的,平時確實需要不少外文文獻,對于自然科學來講英文文獻檢索首推Elsevier,Springer等。雖然這些數(shù)據(jù)庫里面文獻已經(jīng)不算少了。但是有時還會碰到查不到的文獻,而這些文獻的數(shù)據(jù)庫我們所在研究所或大學又沒有買,怎么辦?我基本通過以下向個途徑來得到文獻。 1.首先在Google 學術(shù)搜索里進行搜索,里面一般會搜出來你要找的文獻,在Google學術(shù)搜索里通常情況會出現(xiàn)“每組幾個”等字樣,然后進入后,分別點擊,里面的其中一個就有可能會下到全文,當然這只是碰運氣,不是萬能的,因為我常常碰到這種情況,所以也算是得到全文文獻的一條途徑吧??梢栽囈幌?。同時,大家有沒有發(fā)現(xiàn),從Google學術(shù)搜索中,還可以得到一些信息,Google學術(shù)搜索中會顯示出你搜索文章的引用次數(shù),不過這個引用次數(shù)不準確,但是從側(cè)面反應了這篇文章的質(zhì)量,經(jīng)典文章的引用次數(shù)絕對很高的.同時如果你用作者進行搜索時,會按引用次數(shù)出現(xiàn)他寫的全部的文章,就可以知道作者的哪些文章比較經(jīng)典,在沒有太多時間的情況下,就可以只看經(jīng)典的. 2.如果上面的方法找不到全文,就把文章作者的名字或者文章的title在Google 里搜索(不是Google 學術(shù)搜索),用作者的名字來搜索,是因為我發(fā)現(xiàn)很多國外作者都喜歡把文章的全文(PDF)直接掛在網(wǎng)上,一般情況下他們會把自己的文章掛在自己的個人主頁(home page)上,這樣可能也是為了讓別的研究者更加了解自己的學術(shù)領(lǐng)域,順便推銷自己吧。這樣你就有可能下到你想要的文獻的全文了。甚至可以下到那個作者相近的內(nèi)容的其它文章。如果文獻是由多個作者寫的,第一作者查不到個人主頁,就接上面的方法查第二作者,以此類推。用文章的title來搜索,是因為在國外有的網(wǎng)站上,例如有的國外大學的圖書館可能會把本校一年或近幾年的學術(shù)成果的Publication的PDF全文獻掛在網(wǎng)上,或者在這個大學的ftp上也有可能會有這樣類似的全文.這樣就很可能會免費下到你想要的全文了. 3.如果上面兩個方法都沒有查到你要的文獻,那你就直接寫郵件向作者要。一般情況下作者都喜歡把自己的文獻給別人,因為他把這些文獻給別人,也相當于在傳播他自己的學術(shù)思想。下面是本人向老外作者要文獻的一個常用的模板: Dear Professor ××× I am in ××× Institute of ×××, Chinese Academy of Sciences. I am writing to request your assistance. I search one of your papers: 。。。。。。。。。。。。。。。。。(你的文獻題目) but I can not read full-text content, would you mind sending your papers by E-mail? Thank you for your assistance. Best wishes !(or best regards) ××× 本人的經(jīng)驗是講英語的國家的作者給文章的機率會大,一般你要就會給,其它不講英語的國家,如德國,法國,日本等國家的作者可能不會給。出于禮貌,如果你要的文獻作者E-mail給你了,千萬別忘記回信致謝. 4.最后一種方法其實大家都熟悉,就是發(fā)貼在小木蟲上求助。我還用另一種方法,就是直接讓我所在的研究所圖書館的管理員幫我從外面的圖書館文獻傳遞。不過有的文獻可能是要錢的。一頁0.3元,由于我們看文獻的錢都是由課題出,所以也就不太考慮錢的問題了。 二.如何快速而準確地獲得最新的科研信息. 如何快速準確地從浩如煙海的信息海洋中獲取所需的信息,并學會分析、利用信息資源已經(jīng)成為人們立足于信息社會的一個重要技能.提高自己在當今復雜的信息世界中準確、快速地獲取信息的能力,對我們科研人員是至關(guān)重要的.我們要時時刻刻了解最新的科研成果,最主要的途徑還是要了解最新的科研文獻,但是對于我們常用的數(shù)據(jù)庫,我們又不可能每天都去訪問一次數(shù)據(jù)庫來查看是否有最新的文獻出來,而對于許多國外的數(shù)據(jù)庫.文章的出版效率非常高,有的是每周出幾篇新的文章,有的是每半月出一次,還有一月出一次的,所以大家發(fā)現(xiàn)很難有精力保持每天都去瀏覽數(shù)據(jù)庫.但是大家有沒有發(fā)現(xiàn),國外的數(shù)據(jù)庫有個很好的服務(wù)功能就是如果你在其數(shù)據(jù)庫的網(wǎng)站上注冊了郵箱,數(shù)據(jù)庫就會自動在每期有新的文章出來時把文章的內(nèi)容及鏈接發(fā)到你的郵箱里,直接通知你.這樣就對我們獲取到最新的信息提供了方便.以Elsevier為例,在數(shù)據(jù)庫網(wǎng)站上有"Alerts"點點擊進入,要求你輸入"User Name"和"Password",這是對已經(jīng)注冊了郵箱的人進行的.如果你還沒有注冊,同樣會看到右邊有一行英語"If not, Register Now. It's FREE and allows you to"這時點擊右邊的"Register Now",就可以進入進行注冊,選擇你要求的期刊以及你所研究的領(lǐng)域等等,當然還要填好你接受郵件的郵箱,注冊成功后,以后就可以收到最新的文獻了,同時你可以隨時修改你的接受郵件的郵箱.不僅是象Elsevier這樣的數(shù)據(jù)庫有這個功能.幾呼所有的外文數(shù)據(jù)庫都有"Email-Alert"這一功能.大家可以試試. 三.如何進行文獻閱讀 其實做科研,不看文獻要做好科研,可以說一點可能都沒有。只有廣看論文,深入學習,才能厚積薄發(fā),寫出響當當?shù)奈恼鲁鰜?。讀文獻一定不要心浮氣躁,或者就是想著混個畢業(yè)。相反我們要沉下心來,大量閱讀文獻,在讀的過程中有的文獻看懂了,但是看不懂的文獻也可能會居多??炊恼J真學習借鑒,看不懂的 深入探索,實在不行就暫時放下,過一段時間,隨著知識和能力的提高慢慢也就弄明白了一些。即使還是看不懂,但是心里知道有那么回事,為將來的繼續(xù)深造做了鋪墊。另外千萬不要只是為看文獻而看文獻,我們看的目的是為了能為我們自己的科研所用,所以看的過程中一定要和你自己的數(shù)據(jù)相結(jié)合,當看完一篇文獻后,要好好總結(jié),如果用自己的數(shù)據(jù),又該怎么樣解釋。還有一些牛刊物上的文章,不但要學習文章里面的知識,還要學習牛人寫文章的文風。好的文章肯定會有好的文風,這些都是我們將來寫文章要學習的。 另外相信很多搞科研的同行會有個感覺,就是看過的文獻,如果只是做做標記,劃下劃線,還是很容易忘記,過段時間要查詢起來也費事。尤其是看過的文獻有幾百,上千篇時,雖然可以歸類整理,但效果還是不好。 我建議大家邊看一篇文獻時,邊打開word文檔,邊整理文章出彩和重要的部分,然后復制過去,標上文獻的標題和作者等相關(guān)信息,把每一類文獻歸為一組。 方法操作簡單,將來要查詢和反復的時候會有很大幫助,尤其在寫文章時,相關(guān)文獻及其亮點都一目了然。這個方法積累久了,對提升寫作和閱讀都有很大幫助,除了這樣,我還有時把一些很經(jīng)典的段落或都語句翻譯成中文,專門整理在一個本本上,這樣不但在以后寫文章時直接拿出來看,省事省時間,還能錘煉英漢互譯的能力,很有利于以后你和老外交流時的口語表達。 最后,請大家始終記住,我們查文獻都是為了科研,千萬不要只查不看,費了那么大勁查到了就一定要看完.就算是你大概的看了一下也是有用的.同樣對科學問題要辯證的看待,文獻上別人的觀點也只是一家之言,而且不要迷信權(quán)威. “ 科學本身是人類的一種實踐??茖W研究是一個思考過程。科學行動則是推行某種思考過程的活動,其目的是為了檢驗這些思考過程的有效性,進而修正和改善這些思考過程,以期達到最高的認識。像一切科學實踐一樣,科學的判斷力取決于個人的經(jīng)驗、信仰和情緒。 我們中間的許多人,或者說我們?nèi)w,在我們的專業(yè)經(jīng)歷中,都犯過這樣或那樣的錯誤??茖W工作者應當有虛懷若谷的精神,敢于摒棄先入之見,敢于擺脫對錯誤思想感情上的依附. NO.2 這是一位出國留學博士生的學習體會,放到師生互動欄目里與大家交流、分享。 這是我受網(wǎng)上一篇文章的啟發(fā)并結(jié)合我們專業(yè)的特點,寫的一點個人體會,希望對大家有所裨益。 要在高起點上開展學術(shù)研究,閱讀英文原文是不可或缺的環(huán)節(jié)。英文文獻閱讀的重要性不需贅述,國內(nèi)多數(shù)理工科院校的研究已經(jīng)實現(xiàn)了和國際的接軌,管理和經(jīng)濟學科相對滯后,但是部分團隊已經(jīng)走在前列。 中文文獻看多了之后就會發(fā)現(xiàn)很多內(nèi)容似曾相識,英文文獻在內(nèi)容的廣度和深度方面更勝一籌。閱讀英文文獻的目的不是為了論文增加幾個參考文獻而看上去好看,當然國內(nèi)有些人是這么做的,更有甚者為了增加英文參考文獻而引用二手或者三手文獻,在轉(zhuǎn)引過程中漏洞百出。廣泛閱讀英文文獻是提高綜合能力及水平,優(yōu)化知識結(jié)構(gòu),轉(zhuǎn)換思維方式,拓展研究視野的必由之路,當然最重要的是將國際先進和中國實際相結(jié)合。 (1)英文原文讀不懂怎么辦? 其實我以前也根本沒讀過原文,也看不懂。這兒有個好辦法:找一本中文經(jīng)典的書籍,僅看某一節(jié)你感興趣或與你相關(guān)的內(nèi)容,然后先找一兩篇英文的綜述(review)認真閱讀一下,不會的單詞可用金山詞霸查一查,也許你讀第一篇文章需要花兩天,你過兩天再讀第2遍時,你也許只要一天;然后你再讀第2篇時也許你只要半天!然后你一定會真正發(fā)現(xiàn)讀英文文獻的快感?。ㄒ貌糠郑?nbsp;我和這位作者有相同的體會,剛開始閱讀的時候可能有些困難,當你經(jīng)過一個時期的訓練之后,就會很快進入狀態(tài),并且感覺受益良多。 (2)我們需要閱讀什么樣的文獻? 雖然英文文獻總體上水平比較高,但并不是所有的文獻都值得閱讀,閱讀文獻的前提是能夠檢索到對你有價值的文獻。第一步知道如何檢索文獻,現(xiàn)在學校的英文數(shù)據(jù)庫平臺很多,可以嘗試檢索和合理利用。當然機器檢索不能完全找到和主題相關(guān)的文章,需要擴大檢索范圍,然后認真閱讀摘要,篩選和自己工作相關(guān)的文獻。第二步知道如何確定文章的價值,這和中文文獻閱讀具有相似之處,首先是重要期刊的文章,其次是著名學者的文章。例如在國家創(chuàng)新體系領(lǐng)域,Lundvall\Freeman\Nalson\OECD\Porter等這些重要的作者和機構(gòu)的文獻是必讀的,不僅要精讀他們的經(jīng)典文獻,而且要追蹤其最新研究成果,包括工作論文、討論稿等。通過對重要作者的研究和經(jīng)典文獻的閱讀能給你打開一扇門,讓你進入一個由核心作者、相關(guān)作者、主要期刊和主要研究機構(gòu)形成的學術(shù)網(wǎng)絡(luò)。 (3)閱讀英文文獻需要持之以恒 英文文獻的閱讀需要持之以恒。不只是為了寫文章或者做項目才去檢索和閱讀文獻,而是需要貫穿于研究生學習的全過程。這是選題和把握前沿領(lǐng)域的重要途徑,同時也可以提高自己的英文閱讀能力。當然,文獻閱讀的效果不會在短期內(nèi)顯現(xiàn)出來,不能說讀了幾篇英文文獻就怎么樣,但是當你把英文文獻作為主要閱讀對象時,可能會漸漸發(fā)生變化。 有些中文文獻存在不足之處,例如,數(shù)據(jù)可靠性差、觀點(判斷)不可檢驗;方法運用存在缺陷;文獻綜述不全面等。對于多數(shù)社會科學而言我們最終還是要研究中國問題,中文文獻是入門的基礎(chǔ),國內(nèi)重要期刊的文章仍然需要有一個全面的了解。 如果平時讀得多了,自然會有感覺,找更高級別雜志的文章讀。國外著名的科學家一般都有一個習慣,即每周都認真讀1-2篇Science, Nature, Cell等高級別文章。這個習慣希望每個人都能保持!而且Science對中國人是免費的!Nature中也有許多內(nèi)容是免費的,即使沒有密碼之類,也能得到大量有用的信息呀。臨床的同志一定要讀讀The lancet和新英格蘭雜志!這兩本簡直太經(jīng)典了! NO.3 如何閱讀外文文獻? 本人是學經(jīng)濟的.看了大量的外文文獻.開始時也覺得效率低,不是單詞不認識,而是看了后面忘了前面.后來摸索出了一些方法,和大家共享. 三步驟: 首先,通讀各個小標題.通常英文文獻都很長.拿來文獻,先把各個小標題串一串.弄清楚內(nèi)在的聯(lián)系. 其次,跳進去讀各個小標題內(nèi)的內(nèi)容.標注是必不可少的,就是在必要的段落標示出作者的觀點.這是為了第三步做準備. 最后,跳出來,再把全文串一遍.根據(jù)做好的標示做好閱讀摘要. 這樣就完成了. 【轉(zhuǎn)帖:讀外文文獻的一點體會】 PS:一直不會看外文文獻,學學人家。 本人英語基礎(chǔ)不好,沒過六級,所以在碩士的時候基本上看的外文文獻很少,現(xiàn)在想想很后悔,2年的時間少學了很多東西。上了博士,自己給自己的定位也高一些了,開始打算硬著頭皮咬著牙很不情愿的也要多看些外文文獻,一開始看比較慢,有些很難理解,到現(xiàn)在大約仔細閱讀了100篇外文文獻,泛讀了100篇外文文章,受益匪淺,現(xiàn)在基本不怎么看中文的了,確實也覺得外文的質(zhì)量就是高(也有湊數(shù)的爛文章),現(xiàn)在自己寫外文的也很順手了。談幾點自己的體會。 1.先找5篇跟自己論文最相關(guān)的外文文章,花一個月的時間認認真真的看,反復看,要求全部讀懂,不懂的地方可以和同學和老師交流一下。一個月以后你已經(jīng)上路了。 2.如何讀標題:不要忽視一篇論文的標題,看完標題以后想想要是讓你寫你怎么用一句話來表達這個標題,根據(jù)標題推測一下作者論文可能是什么內(nèi)容。有時候一句比較長的標題讓你寫,你可能還不會表達。下次你寫的時候就可以借鑒了 3.如何讀摘要:快速瀏覽一遍,這里主要介紹這篇文章做了些什么。也許初看起來不好理解,看不懂,這時候不要氣餒,不管它往下看,等你看完這篇文章的時候也許你都明白了。因為摘要寫的很簡潔,省略了很多前提和條件,在你第一眼看到摘要而不明白作者意圖的時候看不懂是正常的。 4.如何讀引言(前言):當你了解了你的研究領(lǐng)域的一些情況,看引言應該是一件很容易的事情了,都是介紹性的東西,寫的應該都差不多,所以看文獻多了以后看這部分的內(nèi)容就很快了,一掃而過。有些老外寫得很經(jīng)典得句子要記下了,下次你寫就可以用了。 5.如何讀材料及試驗:當你文獻看多了以后,這部分內(nèi)容也很簡單了,無非就是介紹試驗方法,自己怎么做試驗的。很快就能把它看完了吧 6.如何看試驗結(jié)果:看結(jié)果這部分一定要結(jié)合結(jié)果中的圖和表看,這樣看的快。主要看懂試驗的結(jié)果,體會作者的表達方法(例如作者用不同的句子結(jié)構(gòu)描述一些數(shù)字的結(jié)果)。有時看完以后再想想:就這么一點結(jié)果,別人居然可以大篇幅的寫這么多,要是我可能半頁就說完了? 7.如何看分析與討論:這是一篇文章的重點,也是最花時間的。我一般把前面部分看完以后不急于看分析討論。我會想要是我做出來這些結(jié)果我會怎么來寫這部分分析與討論呢?然后慢慢看作者的分析與討論,仔細體會作者觀點,為我所用。當然有時候別人的觀點比較新,分析比較深刻,偶爾看不懂也是情理之中。當你看的多了,你肯定會看的越來越懂,自己的idea越來越多 8.如何看結(jié)論:這個時候看結(jié)論就一目了然了,作后再反過去看看摘要,其實差不多 9.把下載的論文打印出來,根據(jù)與自己課題的相關(guān)性分三類,一類要精讀,二類要泛讀,三類要選擇性的讀。分別裝訂在一起 10.看完的文獻千萬不要丟在一邊不管,3-4個月一定要溫習一遍,可以根據(jù)需要,對比自己的試驗結(jié)果來看 11.學會記筆記,重要的結(jié)論,經(jīng)典的句子,精巧的試驗方案一定要記下來,供參考和學習 12.有些試驗方法相同,結(jié)論不同的文獻,可以批判性的閱讀。我想要是你自己做試驗多的話,你應該有這個能力判斷誰的更對一點。出現(xiàn)試驗方法相同,結(jié)論不同的原因有下:試驗方法描述不詳細,可能方法有差別;試驗條件不一樣;某些作者夸大結(jié)果,瞎編數(shù)據(jù) 13.有時間還是多看點文獻吧,最好定個目標:在學術(shù)上超過自己的老板。因為老板一般不看文獻,他們都是憑經(jīng)驗做事,很多新東西他們都不知道,慢慢的你老板會覺得你很厲害。 反正我覺得多讀了,讀起來就快了,而且也會慢慢喜歡上看外文文獻,收獲自然也就多了。 可能寫得有點亂,湊合看吧,我們一起奮斗!!!
posted @
2012-05-21 21:16 mengkai 閱讀(337) |
評論 (0) |
編輯 收藏
摘要: 源地址:http://blog.csdn.net/v_july_v/article/details/7577684http://blog.csdn.net/v_july_v/article/details/6142146
數(shù)據(jù)挖掘領(lǐng)域十大經(jīng)典算法初探
第一篇:從決策樹學習談到貝葉斯分類算法、EM、HMM
引言
最近在面...
閱讀全文
posted @
2012-05-21 20:14 mengkai 閱讀(726) |
評論 (0) |
編輯 收藏
最近在學opencv,先用vc6.0+opencv1.0,可以根據(jù)opencv論壇上的步驟配置完成,下面記錄了配置過程。
下面是介紹如何安裝opencv1.0
1 下載OpenCv1.0,可以在這里下載:http://www.opencv.org.cn/download/OpenCV_1.0.exe
2 安裝OpenCv1.0,可以安裝在D:\opencv1.0\OpenCV(用戶可以自己選擇),
3 在安裝是勾選Add\OpenCV\bin to the systerm PATH(將\OpenCV\bin加入系統(tǒng)變量)
4 添加環(huán)境變量,右擊我的電腦,選擇屬性,點擊高級選項卡,點擊環(huán)境變量,在用戶變量下找到path(沒有的話新建),點擊編輯,在變量值的最后添加 D:\opencv1.0\OpenCV\bin,然后點擊確定,重啟電腦。
5 下載cxcore100.dll文件,可在以下網(wǎng)站下載:
http://www.codefans.net/dll/download.php?id=1425&type=wj
然后將文件cxcore100.dll以及安裝目錄D:\opencv1.0\OpenCV\bin下的highgui100.dll,libguide40.dll拷貝到C:\WINDOWS\system32目錄下。
下面就是介紹vc6.0下配置opencv1.0
一 在VC編譯器下,在Project菜單下選擇setting,彈出對話框。
1 設(shè)置預編譯的頭文件
選擇C/C++ 【Category】,在下拉菜單中選擇Preprocessor,然后在Additional Include directories 中輸入以下幾項:
C:\Program Files \OpenCV\cv\include (根據(jù)本人機器上OpenCV的安裝路徑進行設(shè)置,如在D盤,則寫D: ,以下同)
C:\Program Files \OpenCV\otherlibs\highgui
C:\Program Files \OpenCV\cxcore\include(新版本需要)
C:\Program Files \OpenCV\otherlibs\cvcam\include
每一條之間用逗號隔開。其中C:\Program Files\Intel\opencv 為OpenCV的安裝路徑,這是通用的安裝路徑,建議最好采用這種設(shè)置,以方便大家交流;不然,每次都要重新設(shè)置路徑,比較麻煩。
2 設(shè)置鏈接庫
在 Link按鍵下的 Category下拉菜單中選擇 Input選項(指定要連接的庫文件,放棄連接的庫文件hao ),在Additional library path中,輸入:
C:\Program Files \OpenCV\lib
最后在 Setting For下拉菜單中依次選擇 Win32 Debug和 Win32 Release,分別在Object /library modules 輸入:
cv.lib highgui .lib cxcore.lib cvcam.lib
注意每個庫之間用一個空格隔開。
或者直接在all configurations中的Object /library modules 輸入:cv.lib highgui.lib cxcore.lib(新版本需要) cvcam.lib
(cxcore.lib highgui.lib 是幾乎所有OpenCV程序都要用到的函數(shù)庫,分別封裝了基本的函數(shù)和圖形界面接口,cv.lib中封裝了大量的圖像處理函數(shù),cvcam.lib中封裝了很多針對視頻流的處理函數(shù))
當前工程就可以使用OpenCV的函數(shù)了。
二 如果一直要使用OpenCV的函數(shù),把其路徑設(shè)置到系統(tǒng)目錄下
在Tools 菜單下選擇 Options 子菜單,在彈出的對話框中選擇Directory,將用到的幾個庫的路徑添加進去。以后只需將所用的庫在Object /library modules下輸入就可以了,不用再每次指定路徑。
在Show directories for 下拉菜單中選擇Include files,輸入:
C:\Program Files \OpenCV\cv\include
C:\Program Files \OpenCV\otherlibs\highgui
C:\Program Files \OpenCV\cxcore\include(新版本需要)
C:\Program Files \OpenCV\otherlibs\cvcam\include
在Show directories for 下拉菜單中選擇Library files,輸入:
C:\Program Files \OpenCV\lib
注意:(防止每次都拷貝.dll文件)
-
安裝OpenCv是一定要勾選Add\OpenCV\bin to the systerm PATH
-
配置VC6.0時要選擇用戶自己的OpenCv安裝路徑。
-
編寫OpenCv程序時,要手動添加lib文件,否則編譯不會通過。
posted @
2012-03-03 21:02 mengkai 閱讀(4100) |
評論 (0) |
編輯 收藏
回來已經(jīng)不知不覺一個月了,但是根本沒有找到感覺,自我定位還是不明確,所以需要寫點計劃
在網(wǎng)上看到很多人都寫了自己的學期計劃,大多目標都很明確。我剛開學的時候思想的很浮動,混亂了一段時間,做很多事情效率都很低。到現(xiàn)在已經(jīng)過去四周的時間了,經(jīng)過一些思考,基本上也有了一套學習計劃。
第一是英語,以前的我沒有重視英語真是一個大大的錯誤,雖然不是很喜歡,但是每天還是要花些時間學習,畢竟六級還沒有過去,雖然聽說比考試更重要,但是還得需要一個成績來證明這些成果。
第二是算法,為以后的就業(yè)和找工作做好鋪墊。要多看一些算法的書籍,來加強自己在算法方面的不足,數(shù)據(jù)結(jié)構(gòu)更要努力。有機會一定多讀讀算法導論這邊書。
第三是操作系統(tǒng),順便需要看看匯編,現(xiàn)在感覺操作系統(tǒng)和匯編有著緊密的聯(lián)系,而且對編程有著事半功倍的效果,需要仔細看看。
第四是計算機組成原理,需要鞏固這方面的知識,此外需要深入計算機體系結(jié)構(gòu)這邊書,是相當?shù)慕?jīng)典,需要慢慢的去琢磨。
第四是linux,這方面比較欠缺,所以需要下點功夫。
第五是windows編程以及畢業(yè)設(shè)計相關(guān)的東西opencv,網(wǎng)絡(luò)編程博大精深,需要慢慢的去研究,目標跟蹤是我選的題目需要搭起框架,在目標跟蹤算法進一步作出選擇和改進。
我沒有想好去大公司還是剛起步的小公司,只是努力把自己的基礎(chǔ)搞好,希望入職的時候可以有一個好的薪水,能夠未來能養(yǎng)活自己的家庭老婆。
posted @
2012-03-03 20:54 mengkai|
編輯 收藏
對于斐波那契數(shù)列的求解過程的幾種方法的比較
(1)最基本的方法:遞歸實現(xiàn),使用公式為f[n] = f[n-1] + f[n-2];遞歸
結(jié)束條件是f[1]=1,f[2]=1。
(2)數(shù)組實現(xiàn):空間復雜度和時間復雜度都是O(N),效率一般,比遞歸來
的快。
(3)vector<int>實現(xiàn),時間復雜度是O(N),空間復雜度O(1),但是不知道
效率會高不高,當然vector有自己的屬性會占用資源。
(4)queue<int>實現(xiàn),當然隊列數(shù)組更適合實現(xiàn)斐波那契數(shù)列,時間復雜度
和空間復雜度和vector一樣。但是queue太合適這里了,
f(n)=f(n-1)+f(n-2),f(n)只和f(n-1)和f(n-2)有關(guān),f(n)入隊列后,f(n-
2)就可以出隊列了。
(5)迭代實現(xiàn):迭代效率最高,時間復雜度是O(N),空間復雜度是O(1),
(6)百度的提供的一種公式法。 由于double類型的精度還不夠,所以程
序算出來的結(jié)果會有誤差,如果把公式展開計算,得出的結(jié)果就是正確的。
具體代碼如下:
//遞歸
int fib1(int num)
{
if(num<1)
return -1;
if(num == 1 || num == 2)
return 1;
return f(n-1)+f(n-2);
}
//數(shù)組實現(xiàn)
int fib2(int num)
{
if(num<1)
return -1;
if(num<3)
{
return 1;
}
int *a = new int[num];
a[0] = a[1] = 1;
for(int i = 2;i<num;i++)
a[i] = a[i-1] + a[i-2];
int ret = a[num-1];
delete[] a;
return ret;
}
//vector<int>
int fib3(int num)
{
if(num<1)
return -1;
vector<int>a(2,1);
a.reserve(3);
for(int i = 2;i<num;i++)
{
a.insert(a.begin(),a.at(0)+a.at(1));
a.pop_back();
}
return a.at(0);
}
//queue<int>實現(xiàn)
int fib4(int num)
{
if(num<1)
return -1;
queue<int>q;
q.push(1);
q.push(1);
for(int i = 2;i<num;i++)
{
q.push(q.front()+q.back());
q.pop();
}
return q.pop();
}
//迭代實現(xiàn)
int fib5(int num)
{
int i,a=1,b = 1,c = 1;
if(num<1)
return -1;
for(i = 2;i<num;i++)
{
c= a + b;
a = b;
b = c;
}
return c;
}
//公式實現(xiàn)
int fib6(int num)
{
double gh = sqrt((double)5);
return pow(1+(1+gh),n-pow(1-gh))/(pow((double)2,n)*gh);
}
posted @
2011-10-26 17:46 mengkai 閱讀(906) |
評論 (0) |
編輯 收藏
遞歸算法:基本含義,一個函數(shù)或者數(shù)學結(jié)構(gòu),如果在其定義或說明內(nèi)部直接或間接得出現(xiàn)對其本身的引用,或者是為了描述問題的某一個狀態(tài),必須要用它的上一個狀態(tài),而描述上一個狀態(tài),又必須用到它的上一個狀態(tài),這種定義,稱為遞歸或遞歸定義。在程序設(shè)計上,當函數(shù)直接調(diào)用本身或者間接調(diào)用本身,稱為遞歸調(diào)用。
遞歸的最簡單應用:通過各項關(guān)系及初值求數(shù)列的某一項。(1)
比如階乘數(shù)列
1、2、6、24、120、720……
如果用上面的方式來描述它,應該是:
,程序?qū)崿F(xiàn)
int fun(int x)
{
if(x == 1)
return 1;
return n*fun(n-1);
}
(2)找出組合數(shù)
找出從自然數(shù)1、2、……、n中任取r個數(shù)的所有組合。例如n=5,r=3的所有組合為:
(1)5、4、3 (2)5、4、2 (3)5、4、1
(4)5、3、2 (5)5、3、1 (6)5、2、1
(7)4、3、2 (8)4、3、1 (9)4、2、1
(10)3、2、1
如何實現(xiàn)呢?
首先分析10個組合,我們可以采用遞歸來實現(xiàn),假設(shè)函數(shù)為combo(int m,int n);為找到自然數(shù)1-m中任取K個數(shù)組合,當?shù)谝粋€數(shù)選定后,后面的k-1個數(shù)是從m-1各數(shù)中選擇得到。我們發(fā)現(xiàn)這將是將m選k個數(shù)轉(zhuǎn)換為m-1個數(shù)中選k-1個數(shù)的組合數(shù)。為了解決此問題,我們可以定義個數(shù)組A,數(shù)組的第一個元素為k,約定函數(shù)將確定的k個數(shù)字的組合第一個數(shù)放在A[k]中,當一個組合求出后,才將數(shù)組A的一個組合輸出,第一個數(shù)可以是m-k,函數(shù)將確定組合的第一個數(shù)放入數(shù)組后,有兩種可能的選擇,因還未到頂組合的其余元素,繼續(xù)遞歸確定,或因一確定了組合的全部元素,輸出這個組合,
具體代碼:
//遞歸求解組合數(shù)
#define MAX 100
int a[MAX];
void combo(int m,int k)
{
int i,j;
for (i = m;i>=k;i--)
{
a[k] = i;
if (k>1)
{
comb(m-1,k-1);
}
else
{
for (j = a[0];j>0;j--)
{
printf("%4d",a[j]);
}
printf("\n");
}
}
}
更多的練習,
前幾天在博客園看到有人面試時,遇到遞歸算法題,一時手癢就解了一個。順便網(wǎng)上又找來幾個,也實現(xiàn)了。給大家分享一下,開闊一下思路,沒準你明天面試就能用上。
1、編寫一個方法用于驗證指定的字符串是否為反轉(zhuǎn)字符,返回true和false。請用遞歸算法實現(xiàn)。(反轉(zhuǎn)字符串樣式為"abcdedcba")
2、一列數(shù)的規(guī)則如下: 1、1、2、3、5、8、13、21、34...... 求第30個是多少
3、一列數(shù)的規(guī)則如下: 1、12、123、1234、12345、123456......,求第n個數(shù)的遞歸算法(n<=9)。
4、將一整數(shù)逆序,如987654321變?yōu)?23456789。
5、一個射擊運動員打靶,靶一共有10環(huán),連開10槍打中90環(huán)的可能行有多少種?
posted @
2011-10-22 21:22 mengkai|
編輯 收藏
剛不容易寫了幾百字的日志,總結(jié)了最近兩周的心情,結(jié)果網(wǎng)速不好沒有提交上有沒有備份。哎人倒霉喝水都塞牙
posted @
2011-10-14 20:47 mengkai|
編輯 收藏
關(guān)于#include "stdafx.h"
(1)Standard Application Frame Extend沒有函數(shù)庫,只是定義了一些環(huán)境參數(shù),使得編譯出來的程序能在32位的操作系統(tǒng)環(huán)境下運行。Windows和MFC的include文件都非常大,即使有一個快速的處理程序,編譯程序也要花費相當長的時間來完成工作。由于每個.CPP文件都包含相同的include文件,為每個.CPP文件都重復處理這些文件就顯得很傻了。為避免這種浪費,AppWizard和VisualC++編譯程序一起進行工作,如下所示:
1.AppWizard建立了文件stdafx.h,該文件包含了所有當前工程文件需要MFCinclude 文件。且這一文件可以隨被選擇的選項而變化。
2.AppWizard然后就建立stdafx.cpp。這個文件通常都是一樣的。
3.然后AppWizard就建立起工程文件,這樣第一個被編譯的文件就是stdafx.cpp。
4當VisualC++編譯stdafx.cpp文件時,它將結(jié)果保存在一個名為stdafx.pch的文件里。(擴展名pch表示預編譯頭文件。)( 預編譯頭文件通過編譯stdafx.cpp生成,以工程名命名,由于預編譯的頭文件的后綴是“pch”,所以編譯結(jié)果文件是projectname.pch。)
5.當VisualC++編譯隨后的每個.cpp文件時,它閱讀并使用它剛生成的.pch文件。
VisualC++不再分析Windows include文件,除非你又編緝了stdafx.cpp或stdafx.h。這個技術(shù)很精巧,你不這么認為嗎?(還要說一句,Microsoft并非是首先采用這種技術(shù)的公司,Borland才是。)在這個過程中你必須遵守以下規(guī)則:
1.你編寫的任何.cpp文件都必須首先包含stdafx.h。
2.如果你有工程文件里的大多數(shù).cpp文件需要.h文件,順便將它們加在stdafx.h(后部)上,然后預編譯stdafx.cpp。
3.由于.pch文件具有大量的符號信息,它是你的工程文件里最大的文件。
如果你的磁盤空間有限,你就希望能將這個你從沒使用過的工程文件中的.pch文件刪除。執(zhí)行程序時并不需要它們,且隨著工程文件的重新建立,它們也自動地重新建立
(2)stdafx.h文件中包含了一些必要的頭文件(如afxwin.h),對應于stdafx.h有一個stdafx.cpp文件,該文件內(nèi)包含一句: #include "stdafx.h",其作用是令編譯器編譯出一個stdafx.obj預編譯頭文件(pre-compile header,需要設(shè)置編譯選項),在下次編譯時以降低總的編譯時間。若使用ClassWizard定義新類,則有可能在stdafx.h中增加新的 include files。比如,若選用MFC template classes,stdafx.h中便會增加:#include <afxtempl.h>。
(3)注:1.afxwin.h是MFC編程的必需文件,其中包含如CString,CEdit類運行所必需的頭文件,最好保證該句在頭文件首行;它還會調(diào)用windows.h,改頭文件包含有數(shù)據(jù)類型的定義、API入口點定義和其它有用的參數(shù)信息;
2.非MFC工程使用MFC庫時最常見的問題就是windows.h重復包含錯誤:fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>;
3.#define WIN32_LEANAND_MEAN,在windows的頭文件中拒絕接受MFC類庫,以加速編譯時間;
4.afx - afx中的af指的是Application Frame的縮寫,曾經(jīng)有一個技術(shù)開發(fā)團隊專門作Application Frame,后來給這個團隊命名用afx,x本身沒有含義,只不過構(gòu)成一個響亮的口號,后來就一直沿用下來。
5.建立了一個新的空的工程,項目中的stdafx.cpp使用的是Create Precompiled Header (/Yc),而其它.cpp是用的Use Precompiled Header (/Yu),并且Create/Use PCH Trhough File是stdafx.h
(4)stdafx是預編譯頭文件。你可以從VC++集成環(huán)境菜單Project/Settings...中
Project Settings Dialog/C/C++/Category:Precompiled Headers/Use precompiled header file(.pch)的Check Box中看到。已經(jīng)將Stdafx.h文件作為預編譯的頭文件來使用。預編譯頭文件是在編譯所有Code之前,首先進行的動作。通過解析這個文件,取得定義的結(jié)構(gòu)和參數(shù)。這樣就不用在編譯每個文件時都重新進行解析。提高編譯速度。stdafx.h這個名稱是可以改變的,你可以指定預編譯頭文件的名稱。這個只在vc中有用,并不是c++的特性,vc中可以在這里聲明全局變量和ID的地方
(5) fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory
A如果根本沒有stdafx.h,你為何要包含它.一般只有大工程才需要預編譯頭文件.stdafx.h
刪除這一行#include "stdafx.h"
B project-> Settings->c/c++ category->Precomiled Headers 選擇第一個 Not using precompiled headers
C Project->Settings->C/C++->Project Options中把/Fp"Debug/Your_Project_Name.pch"和/Yu"stdafx.h"兩項刪掉就可以了。要注意原來在stdafx.h內(nèi)包含的文件要包含到各個.cpp文件中.
D在*.cpp中的開頭加入#include "stdafx.h".(#include "stdAfx.h" 放到另外#include的前面,也就是程序的最前面。使用預編譯頭文件需要把它放到程序最前面,否則它前面的內(nèi)容會被忽略)
E rebuild all
(6)設(shè)置了預編譯,如果不加#include "stdafx.h", 就會報這個錯: fatal error C1010:
unexpected end of file while looking for precompiled header directive。編譯器通過一個頭文件stdafx.h來使用預編譯頭文件。stdafx.h這個頭文件名是可以在project的編譯設(shè)置里指定的。編譯器認為,所有在指令#include "stdafx.h"前的代碼都是預編譯的,它跳過#include "stdafx. h"指令,使用projectname.pch編譯這條指令之后的所有代碼。因此,所有的CPP實現(xiàn)文件第一條語句都是:#include "stdafx.h"。
posted @
2011-10-10 17:01 mengkai 閱讀(489) |
評論 (0) |
編輯 收藏
對于階乘是個很有意思的函數(shù),給定一個整數(shù),那么它的階乘是多少那?而它末尾有多少個0,
對于這個問題,是不是要直接計算N!?如果溢出怎么辦,我們?nèi)绾慰焖俚恼业皆擃}的結(jié)果?首先要思考的N!= M*10^E。在N之前你需要看看那幾個的成績滿足即可,比如2*5=10,所有2和5乘積就可以得到一個10,于是由于能被2整除的整數(shù)的頻率要高于能被5整除的,所以我們可以取5考即可。
方法一從1開始到N,算出符合要求的個數(shù)。int result=0;
for(i = 1;i<=N;i++)
{
j = i;
while(j%5 == 0)
{
result++;
j/5;
}
}
或者是while(N)
{
result+=N/5;
N/=5;
}
類似可以求解二進制的問題,比如求N!的二進制中最低位1的位置。
由于N!中含有質(zhì)數(shù)2的個數(shù)。等于N/2+N/4+N/8....1.
int lowOfone(int n)
{
int result = 0;
while (n)
{
n>>=1;
result+=n;
}
return result;
}
對于
給定整數(shù)n,判斷它是否為2的方冪(解答提示:n>0&&((n&(n-1))==0))。
轉(zhuǎn)載:
【N!二進制的解法二】
N!含有質(zhì)因數(shù)2的個數(shù),還等于N減去N的二進制表示中1的數(shù)目。我們還可以通過這個規(guī)律來求解。
下面對這個規(guī)律進行舉例說明,假設(shè) N = 11011,那么N!中含有質(zhì)因數(shù)2的個數(shù)為 N/2 + N/4 + N/8 + N/16 + …
即: 1101 + 110 + 11 + 1
=(1000 + 100 + 1)
+(100 + 10)
+(10 + 1)
+ 1
=(1000 + 100+ 10 + 1)+(100 + 10 + 1)+ 1
= 1111 + 111 + 1
=(10000 -1)+(1000 - 1)+(10-1)+(1-1)
= 11011-N二進制表示中1的個數(shù)
小結(jié)
任意一個長度為m的二進制數(shù)N可以表示為N = b[1] + b[2] * 2 + b[3] * 22 + … + b[m] * 2(m-1),其中b [ i ]表示此二進制數(shù)第i位上的數(shù)字(1或0)。所以,若最低位b[1]為1,則說明N為奇數(shù);反之為偶數(shù),將其除以2,即等于將整個二進制數(shù)向低位移一位。
posted @
2011-09-29 13:51 mengkai 閱讀(532) |
評論 (0) |
編輯 收藏
STL容器的學習總結(jié):
第一:迭代器iterator
首先,迭代器的定義,能夠用來遍歷STL容器中的部分或者全部元素,每個迭代器對象都代表著容易中的確定的地址,迭代器類似于指針類型,修改了常規(guī)指針的接口,是一種概念上的抽象,提供了*,++,==,!=,=操作,這些操作和C/C++操作數(shù)組元素時的指針接口一致。不同之處是該迭代器是一種smart pointer,具有遍歷復雜數(shù)據(jù)結(jié)構(gòu)的能力,所有操作行為都使用相同接口,雖然它們的型別不同。迭代器使開發(fā)人員能夠在類或結(jié)構(gòu)中支持foreach迭代
一般分為五種迭代器:輸入迭代器istream_iterator<>和istreambuf_iterator<>,輸出迭代器ostream_iterator<>和ostreambuf_iterator<>,前向迭代器,雙向迭代器,隨機訪問迭代器
back_insert_iterator<Container> 使用Container的push_back成員函數(shù)
front_insert_iterator<Container> 使用Container的push_front成員函數(shù)
insert_iterator<Container> 使用Container的insert成員函數(shù)
reverse_iterator<Container> 從后向前使用Container的insert成員函數(shù)
const——iterator<>
二 分配算符(Allocators)
看看stl中默認的allocator:
namespace std {
template <class T>
class allocator {
public:
//type definitions
typedef size_t size_type; //represent the size of the largest object in the allocation model
typedef ptrdiff_t difference_type; //The type for signed integral values that can represent the distance between any two pointers in the
//allocation model
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type; //The type of the elements
//rebind allocator to type U
template <class U>
struct rebind {
typedef allocator<U> other;
};
//return address of values
pointer address(reference value) const;
const_pointer address(const_reference value) const;
//constructors and destructor
allocator() throw();
allocator(const allocator&) throw();
template <class U>
allocator(const allocator<U>&) throw();
~allocator() throw();
//return maximum number of elements that can be allocated
size_type max_size() const throw();
// allocate but don't initialize num elements of type T
pointer allocate(size_type num,
allocator<void>::const_pointer hint = 0);
// initialize elements of allocated storage p with value value
void construct(pointer p, const T& value);
// delete elements of initialized storage p
void destroy(pointer p);
// deallocate storage p of deleted elements
void deallocate(pointer p, size_type num);
};
}
看了上面的allocator,我們已經(jīng)基本知道他的用處,他一般用在容器中,作為容器的一個成員,但一般是用模版參數(shù)傳入,這樣才可以讓我們換成我們自定義的allocator。
vector就是動態(tài)數(shù)組,在堆中分配內(nèi)存,元素連續(xù)存放,有保留內(nèi)存,如果減少大小后內(nèi)存也不會釋放。新值大于當前大小時才會再分配內(nèi)存。[]可以使用,隨機插入,刪除要慢,快速的在末尾插入元素。最重要一點就是它的迭代器會失效。
比如:typedef vector IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 3 );
// 刪除array數(shù)組中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
if( 2 == *itor ) array.erase( itor );
}
這樣是不行的,需要按照下面的實現(xiàn):
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
if( 2 == *itor )
{
array.erase( itor );
itor--;
}
}
deque,與vector類似,支持隨機訪問和快速插入刪除。與vector不同的是,deque還支持從開始端插入、刪除數(shù)據(jù)0,[]可以使用,速度沒有vector快??焖俚脑L問隨機的元素??焖俚脑陂_始和末尾插入元素,重新分配空間后,原有的元
素不需要備份。對deque排序時,可以先將deque的元素復制到vector,排序后在復制到deque
list。只能順序訪問不支持隨機訪問,不存在空間不夠
關(guān)聯(lián)容器:更注重快速和高效的檢索數(shù)據(jù)的能力
set:快速查找,不允許重復值。
multiset快速查找,允許重復值。
map:一對一映射,基于關(guān)鍵字快速查找,不允許重復值,key不能重復
multimap一對多映射,基于關(guān)鍵字快速查找,允許重復值
容器適配器:對已有的容器進行某些特性的再封裝,
stack:
queue:
(1)獲取向量中的元素值可用三種方式,直接用向量數(shù)組,獲得元素引用,獲得元素的指針。
list:插入操作和刪除操作都不會造成原有的list迭代器失效,每次插入或刪除一個元素就配置或釋放一個元素空間,對于任何位置的元素插入或刪除,list永遠是常數(shù)時間。
posted @
2011-09-27 17:52 mengkai 閱讀(283) |
評論 (0) |
編輯 收藏