<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5758308686553507147</id><updated>2011-09-26T08:22:49.689-07:00</updated><title type='text'>Enjoy life while still live (a work&amp;study blog )</title><subtitle type='html'>I am a wolf struggling in the world, I am creating something. There are several people in the past influnced me quite a lot.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-4914411451939982203</id><published>2010-12-26T16:22:00.000-08:00</published><updated>2010-12-26T16:25:03.921-08:00</updated><title type='text'>破解wii 4.2e</title><content type='html'>Step 1 更新到4.2&lt;br /&gt;&lt;br /&gt;如果你的Wii買回來已經是4.2，以下內容可以不理，可直去下面Step 2，如果你的Wii還是4.1或以下，請跟著做，如果是3.0以下，請用碟更新到3.0以上，例如Mario Kart可以直上3.2&lt;br /&gt;&lt;br /&gt;又如果你的Wii是4.2，但安裝左好多不明的IOS或cIOS，重新做一次也可以，但要把4.2用的bannerbomb替換到 update.zip 內，否則無法運行Banner Bomb！&lt;br /&gt;&lt;br /&gt;原則上4.1和4.2分別不大，4.2主要是封殺非官方軟件的使用，當然今時今日已經全破了，教學指定要升上4.2的原因係統一方法，減少出錯及問題而己！&lt;br /&gt;官方Wii System 4.3 已出，專業區用家請勿線上更新！按我 (2010年6月23日消息)&lt;br /&gt;準備一張SD卡，非SDHC及最好有1G以上空位&lt;br /&gt;&lt;br /&gt;日版機專用update.zip &lt;br /&gt;&lt;br /&gt;美版機專用update.zip&lt;br /&gt;&lt;br /&gt;歐版機專用update.zip&lt;br /&gt;&lt;br /&gt;首先下載你所屬的 update.zip 檔案，然後解壓到SD卡，再放到Wii裡去&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;安裝 The Homebrew Channel Bootmii &lt;br /&gt;&lt;br /&gt;使用 bannerbomb 方法來安裝，首先放上SD記憶卡後，到Wii Option (菜單) &gt; Data Management (資料管理) &gt; Channels (頻道)&gt; SD Card (SD卡), 然後Wii 會查問你是否執行 "Load boot.elf?" , 揀 'Yes' 後會進入 Hackmii installer 程序&lt;br /&gt;&lt;br /&gt;如果不行，沒有跳出來問你，可以到Banner Bomb官網 的第6點，試用其它版本的破解文件，替換private資料夾即可，因為不同主機可能需要不同破解文件！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;然後 Hackmii Installer 會出來，跟著指示安裝 Homebrew Channel, DVDX [optional], Bootmii as boot2 或 IOS .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;真正開始更新你的Wii&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;於The Homebrew Channel執行 Yet Another WAD Manager Mod &lt;br /&gt;&lt;br /&gt;現在開始千萬不要亂來跳Step，否則後悔終生&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;選單向下 尋找及安裝(install)以下wad檔:&lt;br /&gt;用 + 來揀選 IOS70-64-v6687.wad&lt;br /&gt;及 System Menu-NUS-v480.wad [NTSC-J(日) = v480;NTSC-U(美) = v481; PAL(歐) = v482] (只安裝你要的那個，錯區就玩完)&lt;br /&gt;然後按 A 安裝&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;然後再用 + 來揀選安裝其它 22 個不同的 IOS 檔案 及 Shopping Channel-NUS-v18.wad，然後按 A 安裝，理論上應該有23個檔案要你安裝，之後按 Home 離開即可&lt;br /&gt;&lt;br /&gt;完成&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;現在你可以清空你的SD Card了&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 2 破解4.2&lt;br /&gt;&lt;br /&gt;準備一張SD卡，非SDHC及最好有1G以上空位&lt;br /&gt;&lt;br /&gt;如果你是Step 1 過來的，請一定要先清空你的SD卡，當然有理無理都清空佢係最好的&lt;br /&gt;&lt;br /&gt;首先下載 modify.zip 檔案，然後解壓到SD卡，再放到Wii裡去 (12-12-2010更新)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;安裝 The Homebrew Channel &amp; Bootmii &lt;br /&gt;&lt;br /&gt;如果你Step 1已經安裝好，再安裝多一次亦無不可，好處係呢個係新的HBC v1.0.8，原則上唔再裝，跳step都可以！&lt;br /&gt;&lt;br /&gt;使用 bannerbomb 方法來安裝，首先如下圖點選 SD Card 然後揀 yes to load boot.dol/elf&lt;br /&gt;&lt;br /&gt;如果不行，沒有跳出來問你，可以到Banner Bomb官網 的第6點，試用其它版本的破解文件，替換private資料夾即可，因為不同主機可能需要不同破解文件！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;然後 Hackmii Installer 會出來，跟著指示安裝 Homebrew Channel, DVDX [optional], &amp; Bootmii as boot2 或 as IOS .&lt;br /&gt;Bootmii 可做可唔做，做左就好似買左保險咁，多份保障而己&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;先來個 NAND backup 吧&lt;br /&gt;可做可唔做，做左就好似買左保險咁，多份保障而己&lt;br /&gt;&lt;br /&gt;重開Wii後，如果BootMii係 installed as boot2，咁樣BootMii係會自動出來的！&lt;br /&gt;如果 Bootmii 係 installed as  IOS，咁樣你就要去 HBC 按Home鍵，揀選Launch Bootmii啦&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;按 3 次開機鍵power去到最尾的選項 然後按 reset 鍵，當然如果你有GC手掣就方便得多啦&lt;br /&gt;&lt;br /&gt;按reset 去揀第一個選項，然後跟著指示去 make your NAND backup，遇見Bad blocks可以不理&lt;br /&gt;做完後用電腦抄起 Bootmii 資料夾, NAND.bin, &amp; keys.bin ，之後係SD卡上刪去呢幾個檔案(改名亦可)&lt;br /&gt;返回The Homebrew Channel &lt;br /&gt;&lt;br /&gt;安裝 Trucha 漏洞&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;執行 MMM [Multi-Mod Manager]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;揀選 install &amp; patch IOS36&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;揀選 Express mode 全部揀 A 直至安裝完為止!&lt;br /&gt;&lt;br /&gt;刪除不應該存在的 IOS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;揀選Remove stubbed IOS，然後按A，你只需要刪除 IOS 222, 223, 249, 250, 254.，其它可以不理！&lt;br /&gt;&lt;br /&gt;安裝 cIOS 及 修改System Menu IOS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;執行 WAD Manager &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;安裝你有需要用到的 IOS 檔，可按 1 掣來一次過安裝全部的IOS (紅色為必需)&lt;br /&gt;&lt;br /&gt;各 IOS 用途&lt;br /&gt;&lt;br /&gt;IOS70-64-v6687[TB+ES_diV+NAND].wad&lt;br /&gt;System 4.2的破解版&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;cIOS202[57]-v5.wad&lt;br /&gt;cIOS222[38]-v5.wad&lt;br /&gt;cIOS223[37]-v5.wad&lt;br /&gt;cIOS224[57]-v5.wad&lt;br /&gt;cIOS249[56]-v20.wad&lt;br /&gt;cIOS250[37]-v20.wad&lt;br /&gt;以上都係cIOS，玩USB Loader/NeoGamma都需要用到，理論上必裝，否則你破解來做什麼&lt;br /&gt;&lt;br /&gt;IOS56-64-v5662.wad&lt;br /&gt;Shopping Channel-NUS-v20&lt;br /&gt;如果需要上 Shop Channel的，以上兩個都要安裝&lt;br /&gt;&lt;br /&gt;NeoGamma_Forwarder.wad&lt;br /&gt;USB_Loader_WiiFlow_Forwarder.wad&lt;br /&gt;以上兩個是主力玩備份遊戲的Forwarder，讓你不用每次都先到HBC，可裝可不裝，隨自己喜歡&lt;br /&gt;&lt;br /&gt;最後按 home 離開. &lt;br /&gt;&lt;br /&gt;教學視頻&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;啟用 System Menu Hacks&lt;br /&gt;可做可唔做，我自己就無做啦&lt;br /&gt;執行 Priiloader 去安裝 preloader 去你部Wii.&lt;br /&gt;啟用 (Enable) desired hacks 及去  settings 揀 make to use the system menu IOS.&lt;br /&gt;&lt;br /&gt;先下載所需的 dol 檔&lt;br /&gt;&lt;br /&gt;Wii Sport Resort 日文版: &lt;br /&gt;Wii Sport Resort 中文版: &lt;br /&gt;Wii Sport Resort 美國版: &lt;br /&gt;&lt;br /&gt;以USB Loader GX 為例子，解壓 dol 檔到根目錄，然後於setting揀選 Alternate DOL: ON 就可以 (緊記Error 002 fix 也要on啊)&lt;br /&gt;&lt;br /&gt;以NeoGamma為例，解壓 dol 檔到NeoGamma目錄，然後於setting揀選 Set "Alternate dol" to DISC、Set "002 Fix" to YES、And set "Save Config" to YES即可，當進入遊戲前，會要求你揀選你要使用的 dol 檔，揀好後就可開始遊戲&lt;br /&gt;&lt;br /&gt;基本上只需進行第一次遊戲時使用 Alternate DOL: ON ，第二次開始可以揀回  Alternate DOL: OFF即可！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q and A&lt;br /&gt;&lt;br /&gt;Q: 係咪一定要上4.2？&lt;br /&gt;A: 唔一定，原則上1.0裝晒所有必需的IOS都可以玩晒全部Game，教學用4.2係方便統一大家的版本而己，你喜歡的話用3.2，4.0都無問題&lt;br /&gt;&lt;br /&gt;Q: 我見有中文化的MENU，用唔用好？&lt;br /&gt;A: 任何修改主機的方法都係有風險的，為了看中文而增加風險，在我個人意見，當然唔值得，不過你係都要裝，當然無話唔得！&lt;br /&gt;&lt;br /&gt;Q: Error001點解決？&lt;br /&gt;A: Error001係指Wii主機查到你有改機晶片，最簡單的方法係查下你粒改機晶片有無得更新防001，例如Wiikey 的1.9s，又或拆番粒改機晶片出來！&lt;br /&gt;&lt;br /&gt;Q: 點解改完機入碟落部Wii，佢又叫我更新？&lt;br /&gt;A: 因為你改機後，變相好多IOS都係舊版，如果你唔想見到d更新，可以用preloader修改，又或睇下你粒choips有無得block update，不過我會建議你唔好用原裝的 disc channel load碟就算，因為咁係最簡單！&lt;br /&gt;&lt;br /&gt;Q: 如果不幸部機壞左，例如讀唔到碟之類，點樣還原比番代理？&lt;br /&gt;A: 上網更新一次就會還原官方的了，你唔講你改過，邊個知&lt;br /&gt;&lt;br /&gt;Q: 用USB Loader，應該插邊個USB頭？&lt;br /&gt;A: 插靠近機底果邊果個&lt;br /&gt;&lt;br /&gt;Q: 買咩HDD好？&lt;br /&gt;A: 基本上買大牌子如 Buffalo、Imation、MAXTOR 都99%得，如果真係怕，建議去電腦商場如黃金旺電等，然後再問問鋪頭邊隻可以比Wii用，問定佢唔得可唔可以換貨，有部分好人d的鋪頭或專業d的鋪頭應該會幫到你！&lt;br /&gt;&lt;br /&gt;Q: USB Loader 有咩壞處？&lt;br /&gt;A: 已知CAPCOM會針對USB Loader上網玩Monster Hunter 時 ban account，估計主要為對付使用金手指的使用者而出手，但CAPCOM只能分辨你係咪用正版，所以會有機會有殺錯，無放過而被(CAPCOM)禁止上線&lt;br /&gt;&lt;br /&gt;Q: 我係韓版機，又好想上4.2，點算？&lt;br /&gt;A: 原則上4.1都可以玩遊戲的，但你死都要上4.2，可以試試用 cIOScorp 3.6 來 install cIOS70 ，然後再裝 4.2 menu，係唔重開機的情況下，一口氣係HBC裝埋priiloader就可以了，過程比較複雜，有興趣可以去google 找找外國文章，關鍵字已經比晒你，亦肯定係work的，不過煩而己！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-4914411451939982203?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/4914411451939982203/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=4914411451939982203' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4914411451939982203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4914411451939982203'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2010/12/wii-42e.html' title='破解wii 4.2e'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-3344354359213760463</id><published>2010-11-23T13:18:00.000-08:00</published><updated>2010-11-23T13:21:12.681-08:00</updated><title type='text'>中文分词以及索引的时候为什么要分词</title><content type='html'>全文检索lucene中文分词的一些总结&lt;br /&gt;2010-03-23 14:53&lt;br /&gt;全文检索几乎是所有内容管理系统软件（CMS）必备的功能，在对公司的CMS产品的开发维护过程中，全文检索始终是客户重点关注的模块，为满足客户各式各样越来越高的要求，对全文检索曾做过一段时间相对深入的研究，尤其是对分词机制，趁如今换工作比较空闲之际做个简单总结。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;1、 什么是中文分词&lt;br /&gt;&lt;br /&gt;学过英文的都知道，英文是以单词为单位的，单词与单词之间以空格或者逗号句号隔开。而中文则以字为单位，字又组成词，字和词再组成句子。所以对于英文，我们可以简单以空格判断某个字符串是否为一个单词，比如I love China，love 和 China很容易被程序区分开来；但中文“我爱中国”就不 一样了，电脑不知道“中国”是一个词语还是“爱中”是一个词语。把中文的句子切分成有意义的词，就是中文分词，也称切词。我爱中国，分词的结果是：我 爱 中国。&lt;br /&gt;&lt;br /&gt;目前中文分词还是一个难题———对于需要上下文区别的词以及新词（人名、地名等）很难完美的区分。国际上将同样存在分词问题的韩国、日本和中国并称为CJK(Chinese Japanese Korean)，对于CJK这个代称可能包含其他问题，分词只是其中之一。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;2、 中文分词的实现&lt;br /&gt;&lt;br /&gt;Lucene自带了几个分词器WhitespaceAnalyzer， SimpleAnalyzer， StopAnalyzer， StandardAnalyzer， ChineseAnalyzer， CJKAnalyzer等。前面三个只适用于英文分词，StandardAnalyzer对可最简单地实现中文分词，即二分法，每个字都作为一个词，这样分出来虽然全面，但有很多缺点，比如，索引文件过大，检索时速度慢等。ChineseAnalyzer是按字分的,与StandardAnalyzer对中文的分词没有大的区别。 CJKAnalyzer是按两字切分的, 比较武断,并且会产生垃圾Token，影响索引大小。以上分词器过于简单，无法满足现实的需求，所以我们需要实现自己的分词算法。&lt;br /&gt;&lt;br /&gt;现有的中文分词算法可分为三大类：基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。后面两者只是听说过，没深入接触过，这里着重讲下基于字符串匹配的分词方法。&lt;br /&gt;&lt;br /&gt;基于字符串匹配的分词方法又叫做机械分词方法，它是按照一定的策略将待分析的汉字串与一个“充分大的”机 器词典中的词条进行配，若在词典中找到某个字符串，则匹配成功（识别出一个词）。按照扫描方向的不同，串匹配分词方法可以分为正向匹配和逆向匹配；按照不 同长度优先匹配的情况，可以分为最大（最长）匹配和最小（最短）匹配；按照是否与词性标注过程相结合，又可以分为单纯分词方法和分词与标注相结合的一体化 方法。常用的几种机械分词方法如下：&lt;br /&gt;&lt;br /&gt;    1）正向最大匹配法（由左到右的方向）；&lt;br /&gt;&lt;br /&gt;    2）逆向最大匹配法（由右到左的方向）；&lt;br /&gt;&lt;br /&gt;    3）最少切分（使每一句中切出的词数最小）。&lt;br /&gt;&lt;br /&gt;这种分词方法，首先要有一个词库。一个好的分词器需要一个庞大优良的词库以及设计优秀的数据结构来缓存该词库。下面使用一个名为MMAnalyzer的开源分词器做简单的分词演示，然后大致讲下怎么样基于lucene实现自己的分词器。MMAnalyzer 简介：&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;1、支持英文、数字、中文（简体）混合分词&lt;br /&gt;&lt;br /&gt;2、常用的数量和人名的匹配&lt;br /&gt;&lt;br /&gt;3、超过22万词的词库整理&lt;br /&gt;&lt;br /&gt;4、实现正向最大匹配算法&lt;br /&gt;&lt;br /&gt;5、词典的动态扩展&lt;br /&gt;&lt;br /&gt;6、分词效率： 第一次分词需要1－2秒（读取词典），之后速度基本与Lucene自带分词器持平。内存消耗： 30M+&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;MMAnalyzer的分词算法如下：&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;1、读取一个字，然后联想，直到联想到不能为止。如果当前可以构成词，便返回一个Token。&lt;br /&gt;&lt;br /&gt;2、如果当前不能构成词语，便回溯到最近的可以构成词语的节点，返回。&lt;br /&gt;&lt;br /&gt;3、最差的情况就是返回第一个单字。&lt;br /&gt;&lt;br /&gt;4、然后从返回结果的下一个字重新开始联想。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;public static void main(String[] args) throws IOException {&lt;br /&gt;&lt;br /&gt;String text = "2008年前三季度，美国次贷危机升级，全球金融持续动荡，世界经济增长全面放缓，全球经济增长动力减弱，世界主要经济体与新兴市场正面临巨大的外部冲击。";&lt;br /&gt;&lt;br /&gt;Analyzer analyzer = new MMAnalyzer();&lt;br /&gt;&lt;br /&gt;TokenStream stream = analyzer.tokenStream("xxx", new StringReader(text));&lt;br /&gt;&lt;br /&gt;        while (true) {&lt;br /&gt;&lt;br /&gt;            Token token = stream.next();&lt;br /&gt;&lt;br /&gt;            if (token == null) break;&lt;br /&gt;&lt;br /&gt;            System.out.print("[" + token.termText() + "] ");&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;返回结果如下：&lt;br /&gt;&lt;br /&gt;[2008] [年前] [三季度] [美国] [次] [贷] [危机] [升级] [全球] [金融] [持续] [动荡] [世界经济] [增长] [全面] [放] [缓] [全球] [经济] [增长] [动力] [减弱] [世界] [主要] [经济] [体] [新兴] [市场] [正] [面临] [巨大] [外部] [冲击]&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;MMAnalyzer分词器有两个构造函数MMAnalyzer()和MMAnalyzer(int n)。&lt;br /&gt;&lt;br /&gt;MMAnalyzer():采用正向最大匹配的中文分词算法，相当于分词粒度等于0。&lt;br /&gt;&lt;br /&gt;MMAnalyzer(int n):参数为分词粒度：当字数 &gt;= n，且能成词，该词就被切分出来。&lt;br /&gt;&lt;br /&gt;另外MMAnalyzer还有以下常用方法：&lt;br /&gt;&lt;br /&gt;addDictionary(FileReader reader)：增加一个新词典，采用每行一个词的读取方式。&lt;br /&gt;&lt;br /&gt;addWord(String newWord)：往词库里新增加一个新词。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;其中addWord方法测试了好像只会把新词加入到缓存了的词库中，并不会并永久性写入词典文件中。如果需要写入词典文件，可再按以下方法处理。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;URL dictionaryPath = URLUtil.getResourceFileUrl("resources/dictionary.txt");&lt;br /&gt;&lt;br /&gt;if(dictionaryPath != null){&lt;br /&gt;&lt;br /&gt;    // new FileWriter(String, boolean) 第二个参数true表示追加文件到尾部&lt;br /&gt;&lt;br /&gt;    BufferedWriter bw = new BufferedWriter(new FileWriter(dictionaryPath.getPath(), true));  &lt;br /&gt;&lt;br /&gt;    bw.write(searchStr);//追加文件内容  &lt;br /&gt;&lt;br /&gt;    bw.newLine();&lt;br /&gt;&lt;br /&gt;    bw.close();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;       当然也可自己实现分词器，实现过程很简单，首先实现一个Tokenizer（需要继承lucene包里的Tokenizer抽象类），覆写里面的next()方法，这也是lucene分词器实现的最关键的地方。然后再实现一个Analyzer（需要继承lucene包里的Analyzer抽象类），将上面实现的Tokenizer指定给该Analyzer。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;3、  中文分词一些常见问题及解决办法&lt;br /&gt;&lt;br /&gt;3.1 分词的缺失&lt;br /&gt;&lt;br /&gt;比如同义词。用户搜 "北京 饭店" 能不能把" 首都 饭店"也列出来呢？ 这个分词器无能为力。所以这个问题，解决办法就只能是在分词之前，我们再加一层：同义词返回模块。这个思路很不错，也比较简单，很容易实现。关键是词库的建立。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;3.2 优先级&lt;br /&gt;&lt;br /&gt;例如：我还清晰地记得我们坐在江边聊天的情境。&lt;br /&gt;&lt;br /&gt;分出来是： 我 还清 晰 地 记得 我们 坐在 江边 聊天 的 情境。&lt;br /&gt;&lt;br /&gt;结果： 清晰 被拆开了。&lt;br /&gt;&lt;br /&gt;这个是基于词库的分词算法固有的问题。没有很好的解决方法。有统计结果表明，单纯使用正向最大匹配的错误率为1/169，单纯使用逆向最大匹配的错误率为1/245。有一种解决方案是正向匹配结果后再逆向匹配一次，然后比较结果，消除歧义。最好加入词汇概率统计功能.有歧义的用概率决定。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;3.3 最大匹配的问题&lt;br /&gt;&lt;br /&gt;比如搜索“三季度”这个词，词库里同时有 “三季度” 和 “季度”这两个词，分词时按最大正向匹配 则 “三季度” 被分成一个完整的词，按 “季度” 去检索反而搜不出来了。&lt;br /&gt;&lt;br /&gt;解决办法：缩短分词粒度，当字数等于或超过该粒度参数，且能成词，该词就被切分出来。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;3．4 新词识别&lt;br /&gt;&lt;br /&gt;      新词，也就是那些在字典中都没有收录过，但又确实能称为词的那些词。最典型的是人名，人可以很容易理解句子“王军虎去广州了”中，“王军虎”是个词，因为是一个人的名字，但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去，全世界有那么多名字，而且每时每刻都有新增的人名，收录这些人名本身就是一项巨大的工程。即使这项工作可以完成，还是会存在问题，例如：在句子“王军虎头虎脑的”中，“王军虎”还能不能算词？&lt;br /&gt;&lt;br /&gt;     新词中除了人名以外，还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题，而且这些又正好是人们经常使用的词，因此对于搜索引擎来说，分词系统中的新词识别十分重要。目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;其他的还有如热度、高亮显示等问题。总言之，中文分词机制的好坏，直接影响到用户对搜索结果的满意度，所以如何分词是搜索引擎的重中之重。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-3344354359213760463?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/3344354359213760463/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=3344354359213760463' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3344354359213760463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3344354359213760463'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2010/11/blog-post_23.html' title='中文分词以及索引的时候为什么要分词'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-8586496013691311019</id><published>2010-11-17T18:27:00.000-08:00</published><updated>2010-11-17T18:28:18.886-08:00</updated><title type='text'>软件测试</title><content type='html'>软件测试&lt;br /&gt;培训目的&lt;br /&gt;什么是软件测试&lt;br /&gt;&lt;br /&gt;如何做好软件测试&lt;br /&gt;什么是软件测试&lt;br /&gt;软件测试是以发现软件的缺陷为目的，使软件运行，将软件运行中所产生的危险性降低到允许的范围，是一个为发现错误而执行程序的过程&lt;br /&gt;&lt;br /&gt;软件的缺陷是对软件产品预期属性的偏离现象。包括对产品规格说明书的偏离；对客户/用户的期望的偏离，客户/用户的要求没有纳入软件产品中（可能是产品规格说明书说明时的遗漏,也可能是软件实现的问题）。 &lt;br /&gt;软件测试的几个基本概念&lt;br /&gt;单体测试：是指对单个模块或者是一个函数等更小单位的测试&lt;br /&gt;集成测试：是指多个模块组合起来，或者一个子系统的所有模块都结合起来后进行的测试 &lt;br /&gt;系统测试：是指整个系统的所有子系统都结合起来以后进行的测试 &lt;br /&gt;回归测试：是指修复或调整好软件环境之后进行测试&lt;br /&gt;差分测试：是指当测试时间较短时（不足以进行一遍系统测试时），而只对整个系统中新变更或者新追加功能的相关部分的测试&lt;br /&gt;&lt;br /&gt;手动测试：是指测试人员，根据功能规格说明书、编写的测试大纲或者其他测试文档，直接运行程序而完成的测试 &lt;br /&gt;自动化测试：是指测试人员，使用自动测试工具、或者编写测试脚本，让程序自动运行而进行的测试 &lt;br /&gt;软件产品周期简介&lt;br /&gt;根据需求文档进行分析制定测试策略和测试计划&lt;br /&gt;分别根据需求分析、概要设计和详细设计的输出进行测试设计&lt;br /&gt;使用测试设计文档，进行各个阶段的测试执行&lt;br /&gt;产品Release之后进行测试工作的总结&lt;br /&gt;当软件产品周期，需求文档变化时，将重新进行前三个工作&lt;br /&gt;测试计划的制定&lt;br /&gt;主要输入：需求文档和里程碑&lt;br /&gt;&lt;br /&gt;主要输出：测试进度的制定和采取的测试策略&lt;br /&gt;测试进度内容包括测试设计开始和结束的时间，测试执行的开始和结束时间，测试总结开始和结束时间，还包括测试设计、测试执行和测试总结所花费的工作量&lt;br /&gt;测试策略内容包括采取测试方法、测试资源的分配和测试中风险的控制计划&lt;br /&gt;测试设计&lt;br /&gt;根据测试阶段的不同，测试设计包括以下几种&lt;br /&gt;系统测试的测试设计&lt;br /&gt;集成测试的测试设计&lt;br /&gt;性能测试的测试设计&lt;br /&gt;单体测试的测试设计&lt;br /&gt;&lt;br /&gt;其中单体测试的测试设计由开发人员完成，其他一般情况下由测试人员完成&lt;br /&gt;系统测试、集成测试的 测试设计&lt;br /&gt;CheckList的编写&lt;br /&gt;根据需求分析文档得到软件产品应该包括的功能点（包括大小功能点），组成CheckList的第一部分，要求CheckList必须覆盖软件产品应该包括的全部功能点&lt;br /&gt;理解需求分析文档得到每个功能点的细化部分，组成CheckList的第二部分，要求覆盖需求文档中所有可测试的内容&lt;br /&gt;根据测试经验和业务知识，进一步分析需求分析文档，得到需求分析文档上没有描述的内容，补充CheckList的第二部分&lt;br /&gt;对每个功能点的细化部分，确定其测试方法（或者测试步骤）和预计的正确测试结果 &lt;br /&gt;测试用例的编写&lt;br /&gt;需要特殊条件才能测试的功能点，编写测试用例以对应&lt;br /&gt;编写一些测试用例，以覆盖主要的功能点，以供功能验证时使用&lt;br /&gt;性能测试的测试设计&lt;br /&gt;根据性能指标，选择测试用例&lt;br /&gt;根据需求文档得到用户明确要求的性能指标&lt;br /&gt;&lt;br /&gt;版本升级的项目，各功能的性能指标不得低于旧版本的性能指标&lt;br /&gt;&lt;br /&gt;模型产品，新模型各功能的性能指标以不低于旧模型的性能为要求&lt;br /&gt;&lt;br /&gt;根据收集的性能指标，建立性能测试的CheckList&lt;br /&gt;单体测试的测试设计&lt;br /&gt;白盒测试的测试设计&lt;br /&gt;&lt;br /&gt;命令覆盖&lt;br /&gt;&lt;br /&gt;分支覆盖&lt;br /&gt;&lt;br /&gt;路径覆盖&lt;br /&gt;单体测试_白盒测试设计1&lt;br /&gt;单体测试_白盒测试设计2&lt;br /&gt;单体测试_黑盒测试设计&lt;br /&gt;黑盒测试的测试设计&lt;br /&gt;&lt;br /&gt;等价类划分&lt;br /&gt;&lt;br /&gt;边界值分析&lt;br /&gt;测试执行&lt;br /&gt;根据测试阶段的不同，测试执行分成&lt;br /&gt;&lt;br /&gt;单体测试的测试执行&lt;br /&gt;&lt;br /&gt;单集成测试的测试执行&lt;br /&gt;&lt;br /&gt;集成测试和系统测试的测试执行&lt;br /&gt;&lt;br /&gt;性能测试的测试执行&lt;br /&gt;单体测试的测试执行&lt;br /&gt;根据白盒测试设计和黑盒测试设计得到测试用例&lt;br /&gt;编写对待测试代码进行输入和得到输出程序，或者找到能对待测试代码进行输入和得到输出的调试方法&lt;br /&gt;使用测试用例逐一输入，收集输出结果，检查输出结果是否正确&lt;br /&gt;单集成测试的测试执行-1&lt;br /&gt;自顶向下法&lt;br /&gt;单集成测试的测试执行-2&lt;br /&gt;自底向上法&lt;br /&gt;集成测试和系统测试的执行－1&lt;br /&gt;判定需求，执行测试设计和测试用例，填写结果&lt;br /&gt;及时准确反馈产品缺陷&lt;br /&gt;定期完成修改的确认&lt;br /&gt;分析缺陷发生趋势，制定测试策略&lt;br /&gt;需求变更时，对应变更测试设计文档&lt;br /&gt;收集测试数据，分析并使用&lt;br /&gt;集成测试和系统测试的执行－2&lt;br /&gt;判定需求，执行测试设计和测试用例，填写结果&lt;br /&gt;获得测试版本的同时要获得版本对应的测试需求，根据需求选择相关的测试设计文档和测试用例文档&lt;br /&gt;根据选择的文档进行测试，要求至少完成一遍的覆盖，覆盖测试后填写测试结果（OK和NG）&lt;br /&gt;完成版本的测试时，把完成的文档测试结果和该版本发现的缺陷一起提交&lt;br /&gt;&lt;br /&gt;注意：这里提到的需要提交文档测试结果的版本一般上是比较大的版本（项目负责人决定），普通的版本之提交发现的缺陷即可&lt;br /&gt;&lt;br /&gt;集成测试和系统测试的执行－3&lt;br /&gt;及时准确反馈产品缺陷&lt;br /&gt;测试中发现缺陷（包括不确定的）时，首先要进行记录，其次在进行是否缺陷的分析&lt;br /&gt;当天发现的缺陷要尽量在当天完成登陆&lt;br /&gt;要准确填写错误等级和再现率&lt;br /&gt;错误等级&lt;br /&gt; A类为严重影响系统运行（并且不可恢复）&lt;br /&gt; B类为影响系统运行（可以恢复）&lt;br /&gt; C类为不影响系统运行但必须修改&lt;br /&gt; D类为所提建议 &lt;br /&gt;再现率&lt;br /&gt; 要求记录准确的测试和再现次数，尽量不要出现1/1的情况&lt;br /&gt; 再现时注意环境的正确，在已经出现缺陷的环境上继续再现的意义不大&lt;br /&gt; 再现前要尽量通过分析降低再现的难度和再现的步骤&lt;br /&gt;集成测试和系统测试的执行－4&lt;br /&gt;及时准确反馈产品缺陷&lt;br /&gt;补充发现缺陷的相关信息（DEBUG信息，缺陷发生的图片，死机时的堆栈信息，发生缺陷的现场等）&lt;br /&gt;&lt;br /&gt;集成测试和系统测试的执行－5&lt;br /&gt;定期完成修改的确认&lt;br /&gt;当发布新的版本到测试时，要得到该版本开发人员投入的已经修改的缺陷，进行确认&lt;br /&gt;合理的分配测试时间，当测试工作量比较大时，首先完成变更点的测试，然后再进行确认测试&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NotBug的及时确认&lt;br /&gt;对于开发人员分配成NotBug的缺陷进行确认时，要以下面的顺序进行参考&lt;br /&gt; 仕样中是否有明确说明&gt;&gt;用户是否明确的文档说明&gt;&gt;其他模型的参考和自己正确的分析&gt;&gt;开发人员的分析&lt;br /&gt; 出现和开发人员无法达成一致时通过和测试负责人或者项目负责人沟通解决&lt;br /&gt;对于开发人员判断错误的缺陷及时进行NG的处理，使开发人员尽快得到信息&lt;br /&gt;&lt;br /&gt;集成测试和系统测试的执行－6&lt;br /&gt;分析缺陷发生趋势，制定测试策略&lt;br /&gt;&lt;br /&gt;集成测试和系统测试的执行－7&lt;br /&gt;需求变更时，对应变更测试设计文档&lt;br /&gt;对应产品开发过程中的需求变更方法，要和项目开始前的需求分析方法相同，对需求变更的部分及时修改或者填写测试设计文档&lt;br /&gt;&lt;br /&gt;集成测试和系统测试的执行－8&lt;br /&gt;收集测试数据，分析并使用&lt;br /&gt;区分整个测试时间里，测试时间占用情况的分类&lt;br /&gt;功能覆盖测试&lt;br /&gt;脱离测试设计文档的自由测试&lt;br /&gt;差分测试 （针对功能点变更进行的测试）&lt;br /&gt;发现缺陷的再现测试&lt;br /&gt;确认测试&lt;br /&gt;开发人员调试&lt;br /&gt;&lt;br /&gt;根据不同分类收集测试数据&lt;br /&gt;根据测试时间占用情况的分类进行测试数据的收集&lt;br /&gt;&lt;br /&gt;分析测试效率，发现问题&lt;br /&gt;对于功能覆盖测试、自由测试和差分测试都是有效的测试时间，基本上90％以上的缺陷都是这个期间发现的，因此可以得到测试组以及每个测试人员的测试效率，然后再结合实际进行分析，就能得到测试组或者某个测试成员的测试状态如何&lt;br /&gt;性能测试的测试执行&lt;br /&gt;选择性能测试的对象，建立性能测试CheckList&lt;br /&gt;收集评价用的性能数据，向CheckList进行补充&lt;br /&gt;定期根据性能测试CheckList，对产品进行性能测试数据收集&lt;br /&gt;提前进行性能数据的收集，以评估当前的产品是否能够达到性能要求&lt;br /&gt;反馈性能数据&lt;br /&gt;对提前收集的性能数据分析，评估当前的产品不能达到性能要求时立即向开发人员反馈性能数据&lt;br /&gt;对性能测试阶段收集的性能数据，进行分析后提交开发人员&lt;br /&gt;评估和预定的性能指标的差异&lt;br /&gt;帮助开发人员分析造成性能指标差异的原因&lt;br /&gt;例题&lt;br /&gt;Myers问题: 读入三个整数值。这三个数值表示了一个三角形三条边的长度。程序将输出一条信息，说明该三角形是不等边三角形，等腰三角形，还是等边三角形。(并不要求写出程序)写出你认为能充分地测试这个问题的测试实例（即特定的数据集）。&lt;br /&gt;&lt;br /&gt;（格式可写成：测试实例说明     测试实例值       期望输出）。 &lt;br /&gt;例题答案－1&lt;br /&gt;*1 合法的不等边三角形              5    3    4            不等边三角形 &lt;br /&gt;*2 合法的等腰三角形                 3    3    4             等腰三角形 &lt;br /&gt;*3  合法的等边三角形                 3    3    3  等边三角形 &lt;br /&gt;*4  两个相同值边的互换（第一次）   50   50   25           等腰三角形 &lt;br /&gt;5  两个相同值边的互换（第二次）    25   50   50            等腰三角形 &lt;br /&gt;6  两个相同值边的互换（第三次）    50   25   50            等腰三角形 &lt;br /&gt;&lt;br /&gt;*7 一条边为0                        1000  1000  0            非法 &lt;br /&gt;*8  一条边值为负                      3     3    -4            非法 &lt;br /&gt;*9  两条相同边的第一次互换（非法） 5     5    10            非法 &lt;br /&gt;10 两条相同边的第二次互换（非法）  10    5    5             非法 &lt;br /&gt;11 两条相同边的第三次互换（非法） 5     10   5             非法 &lt;br /&gt;*12 两条较小的边长之和小于最大的边长 8     2    5             非法 &lt;br /&gt;13 上例的二条边第二次交换             2     8    5             非法 &lt;br /&gt;14 上例的二条边再次交换               2    5    8              非法 &lt;br /&gt;15 上例的二条边再次交换               8    5    2              非法 &lt;br /&gt;16 上例的二条边再次交换              5    8    2              非法 &lt;br /&gt;17 上例的二条边再次交换               5    2    8           非法 &lt;br /&gt;例题答案－2&lt;br /&gt;*18  所有的边为0                      0    0     0              非法 &lt;br /&gt;*19  第一个参数为非整数   #    3     7              非法 &lt;br /&gt;20  第二个参数为非整数                7    @     8              非法 &lt;br /&gt;21  第三个参数为非整数                6    9     $              非法 &lt;br /&gt;&lt;br /&gt;*22  缺少第一个参数的输入                  4     5              非法 &lt;br /&gt;23  缺少第二个参数的输入              3          5              非法 &lt;br /&gt;24  缺少第三个参数的输入              3    4                    非法 &lt;br /&gt;&lt;br /&gt;*25  三条边大于0，一边等于另两边之和 12   5     7              非法 &lt;br /&gt;26  上例的交换                         12   7    5              非法 &lt;br /&gt;27  上例的再次交换                     5    12   7              非法 &lt;br /&gt;28  上例的再次交换                     5    7    12              非法 &lt;br /&gt;29  上例的再次交换                     7    12   5              非法 &lt;br /&gt;30  上例的再次交换                     7    5    12   非法 &lt;br /&gt;&lt;br /&gt;*31  三条边有最大的可能值 2147483647 2147483647 2147483647（32767） 等边 &lt;br /&gt;32  二条边有最大的可能值  2147483647 2147483647  1           等腰 &lt;br /&gt;33  一条边有最大的可能值    1    2147483647    1                非法&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-8586496013691311019?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/8586496013691311019/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=8586496013691311019' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/8586496013691311019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/8586496013691311019'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2010/11/blog-post.html' title='软件测试'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-3573966611979970892</id><published>2010-11-08T11:52:00.000-08:00</published><updated>2010-11-08T11:53:05.620-08:00</updated><title type='text'>english word</title><content type='html'>Sporting house 妓院（不是体育室）&lt;br /&gt;Dead president 美钞（不是死了的总统）&lt;br /&gt;Lover 情人（不是爱人）&lt;br /&gt;Busboy 餐馆勤杂工（不是公汽售票员）&lt;br /&gt;Busybody 爱管闲事的人（不是大忙人）&lt;br /&gt;Dry goods 纺织品 谷物（不是干货）&lt;br /&gt;Heart man 换心人（不是有心人）&lt;br /&gt;Mad doctor精神病科医生（不是发疯的医生）&lt;br /&gt;Eleventh hour最后时刻（不是十一点）&lt;br /&gt;Blind date（由第三者安排的）男女初次见面（并非盲目的约会或者是瞎约会）&lt;br /&gt;Personal remark人身攻击（并非个人评论）&lt;br /&gt;Sweet water淡水（不是糖水或者甜水）&lt;br /&gt;Confidence man骗子（不是信得过的人）&lt;br /&gt;Criminal lawyer 刑事律师（不是犯罪的律师）&lt;br /&gt;Service station加油站（不是服务站）&lt;br /&gt;Rest room厕所（不是休息室）&lt;br /&gt;Dressing room化妆室（不是试衣间或者更衣室）&lt;br /&gt;Horse sense常识（不是马的感觉）&lt;br /&gt;Capital idea 好主意（不是资本主义思想）&lt;br /&gt;Familiar talk 庸俗的交谈（不是熟悉的谈话）&lt;br /&gt;Black tea红茶&lt;br /&gt;Black art 妖术（不是黑色艺术）&lt;br /&gt;Black stranger 完全陌生的人(不是陌生的黑人)&lt;br /&gt;White coal （作动力来源用的）水&lt;br /&gt;White man忠实可靠的人（不是皮肤白色的人）&lt;br /&gt;Yellow book黄皮书（法国政府报告书，以黄纸为封，不是黄色书籍）&lt;br /&gt;Red tape 官僚习气（不是红色带子）&lt;br /&gt;Green hand 新手&lt;br /&gt;Blue stocking 女学者，女才子（不是蓝色长筒袜）&lt;br /&gt;China policy 对华政策（不是中华政策）&lt;br /&gt;Chinese dragon 麒麟（不是中国龙）&lt;br /&gt;American beauty 一种玫瑰，名叫美丽动人（不是美国美女）&lt;br /&gt;English disease 软骨病（不是英国病）&lt;br /&gt;Indian summer指的是秋天结束到冬天之前温暖的天气---》中国话 秋老虎 （谢谢ekin0906更正）&lt;br /&gt;Greek gift 害人的礼品（不是希腊的礼物）&lt;br /&gt;Spanish athlete 吹牛的人（不是西班牙的运动员）&lt;br /&gt;French chalk 滑石粉（不是法国粉笔）&lt;br /&gt;Pull ones leg 开玩笑（不是拉后腿）&lt;br /&gt;In ones birthday suit 赤身裸体（不是穿着生日礼服）&lt;br /&gt;Eat ones words 收回前言（不是食言）&lt;br /&gt;An apple of love 西红柿（不是爱情之果）&lt;br /&gt;Handwriting on the wall 不祥之兆（不是大字报）&lt;br /&gt;Bring down the house 博得满堂喝彩（不是推倒房子）&lt;br /&gt;Have a fit 勃然大怒（不是试穿）&lt;br /&gt;Make ones hair stand on end 令人毛骨悚然，恐惧（不是令人发指，气愤）&lt;br /&gt;Be taken in 受骗，上当（不是被接纳）&lt;br /&gt;Think a great deal of oneself 高看或者看重自己（不是为自己想的很多）&lt;br /&gt;Pull up ones socks 鼓起勇气（不是提上袜子）&lt;br /&gt;Have the heart to do 用于否定句，忍心做（不是有心做或者有意做）&lt;br /&gt;What a shame 多可惜，真遗憾（不是多可耻）&lt;br /&gt;You don’t say 是吗？（不是你别说）&lt;br /&gt;You can say that again 说的好（不是你别说）&lt;br /&gt;I haven’t slept better 我睡得很好（不是我从未睡好过）&lt;br /&gt;You can’t be too careful in your work 你工作越仔细越好（不是你工作不能太仔细）&lt;br /&gt;It has been 4 years since I smoked 我戒烟4年了（不是我抽烟4年了）&lt;br /&gt;All his friends did not turn up 他的朋友没全到（不是他的朋友全没到）&lt;br /&gt;People will be long forgetting her 人们在很长时间内会记住她的（不是人们会永远忘记她）&lt;br /&gt;He was only too pleased to let them go 他很乐意让他们走（不是他，不愿让他们走太高兴了）&lt;br /&gt;It can’t be less interesting 它无聊极了（不是它不可能没有趣）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-3573966611979970892?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/3573966611979970892/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=3573966611979970892' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3573966611979970892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3573966611979970892'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2010/11/english-word.html' title='english word'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-2075601631530081769</id><published>2010-05-03T07:05:00.001-07:00</published><updated>2010-05-03T07:05:57.969-07:00</updated><title type='text'>分词技术</title><content type='html'>分词又叫,切词,划词等 我感觉是seo中应该仔细学好的技术。 &lt;br /&gt;我有个实验站1000左右ip的站，首页是按照分词写的，每天可以在 &lt;br /&gt;百度得到100~200的ip 效果还是很明显的。 &lt;br /&gt;网上这类详细讲解的文章比较少 我找了几篇转过来，大家可以学下看。 &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------- &lt;br /&gt;查询处理以及分词技术 &lt;br /&gt;&lt;br /&gt;随着搜索经济的崛起，人们开始越加关注全球各大搜索引擎的性能、技术和日流量。作为企业，会根据搜索引擎的知名度以及日流量来选择是否要投放广告等；作为普通网民，会根据搜索引擎的性能和技术来选择自己喜欢的引擎查找资料；作为技术人员，会把有代表性的搜索引擎作为研究对象. 搜索引擎经济的崛起，又一次向人们证明了网络所蕴藏的巨大商机。网络离开了搜索将只剩下空洞杂乱的数据，以及大量等待去费力挖掘的金矿。 &lt;br /&gt;&lt;br /&gt;但是,如何设计一个高效的搜索引擎?我们可以以百度所采取的技术手段来探讨如何设计一个实用的搜索引擎.搜索引擎涉及到许多技术点,比如查询处理,排序算法,页面抓取算法,CACHE机制,ANTI-SPAM等等.这些技术细节,作为商业公司的搜索引擎服务提供商比如百度,GOOGLE等是不会公之于众的.我们可以将现有的搜索引擎看作一个黑盒,通过向黑盒提交输入,判断黑盒返回的输出大致判断黑盒里面不为人知的技术细节. &lt;br /&gt;&lt;br /&gt;查询处理与分词是一个中文搜索引擎必不可少的工作,而百度作为一个典型的中文搜索引擎一直强调其”中文处理”方面具有其它搜索引擎所不具有的关键技术和优势.那么我们就来看看百度到底采用了哪些所谓的核心技术. &lt;br /&gt;&lt;br /&gt;我们分两个部分来讲述:查询处理/中文分词. &lt;br /&gt;&lt;br /&gt;一. 查询处理 &lt;br /&gt;&lt;br /&gt;用户向搜索引擎提交查询,搜索引擎一般在接受到用户查询后要做一些处理,然后在索引数据库里面提取相关的信息.那么百度在接受到用户查询后做了些什么工作呢? &lt;br /&gt;&lt;br /&gt;1. 假设用户提交了不只一个查询串,比如”信息检索 理论 工具”.那么搜索引擎首先做的是根据分隔符比如空格,标点符号,将查询串分割成若干子查询串,比如上面的查询就会被解析为:&lt;信息检索,理论,工具&gt;三个子字符串;这个道理简单,我们接着往下看. &lt;br /&gt;&lt;br /&gt;2. 假设提交的查询有重复的内容,搜索引擎怎么处理呢?比如查询”理论 工具 理论”,百度是将重复的字符串当作只出现过一次,也就是处理成等价的”理论 工具”,而GOOGLE显然是没有进行归并,而是将重复查询子串的权重增大进行处理.那么是如何得出这个结论的呢?我们可以将”理论 工具”提交给百度,返回341,000篇文档,大致看看第一页的返回内容.OK.继续,我们提交查询”理论 工具 理论”,在看看返回结果,仍然是那么多返回文档,当然这个不能说明太多问题,那看看第一页返回结果的排序,看出来了吗?顺序完全没有变化,而GOOGLE则排序有些变动,这说明百度是将重复的查询归并成一个处理的,而且字符串之间的先后出现顺序基本不予考虑(GOOGLE是考虑了这个顺序关系的). &lt;br /&gt;&lt;br /&gt;3. 假设提交的中文查询包含英文单词,搜索引擎是怎么处理的?比如查询”电影BT下载”,百度的方法是将中文字符串中的英文当作一个整体保留,并以此为断点将中文切分开,这样上述的查询就切为&lt;电影,BT,下载&gt;,不论中间的英文是否一个字典里能查到的单词也好,还是随机的字符也好,都会当作一个整体来对待.至于为什么,你用查询” 电影dfdfdf下载”看看结果就知道了.当然如果查询中包含数字,也是如此办理. &lt;br /&gt;&lt;br /&gt;到目前为止,一切很简单,也很清楚,百度怎么处理用户查询的呢?归纳如下:首先根据分割符号将查询分开,然后看看是否有重复的字符串,如果有,就抛弃多余的,只保留一个,接着判断是否有英文或者数字,如果有的话,把英文或者数字当作一个整体保留并把前后的中文切开. &lt;br /&gt;&lt;br /&gt;接着该干什么呢?该考虑分词的问题了. &lt;br /&gt;&lt;br /&gt;二. 中文分词 &lt;br /&gt;&lt;br /&gt;首先,讲讲百度的分词时机或者条件问题,是否是个中文字符串百度就拿来切一下呢?非也,要想被百度的分词程序荣幸的切割一下也是要讲条件的,哪能是个字符串就切割啊?你当百度是卖锯条的么? &lt;br /&gt;&lt;br /&gt;那么什么样的字符串才满足被切割的条件呢?简单说来,如果字符串只包含小于等于3个中文字符的话,那就保留不动,当字符串长度大于4个中文字符的时候,百度的分词程序才出马大干快上,把这个字符串肢解掉. &lt;br /&gt;&lt;br /&gt;怎么证明呢?我们向百度提交”电影下载”,看看返回结果中标为红字的地方,不难看出来,查询已经被切割成&lt;电影,下载&gt;两个单词了,说明分词程序已经开工了,如果是比4个中文字符更长的字符串,那分词程序就更不客气了,一定大卸八块而后快.我们来看看三个字符的情况,提交查询”当然择”,看起来这个查询不伦不类,那是因为我希望看到这个字符串被切分为&lt;当然,择&gt;,返回结果365篇相关页面,翻到最后一页,发现标红的关键字都是”当然择”连续出现的情况,好像没有切分,但是还不确定,那么再提交人工分好的查询”当然 择”看看,返回结果1,090,000篇,基本上可以确定没有进行分词了,当然另外一种解释是:对于三个字符先切分,然后将切分后的结果当作一个短语查询,这样看到的效果和没有切分是相似的.但是我倾向于判断百度对于少于3个字符的串没有切分,奥卡姆不是说了么”如无必要,勿增实体”,干吗做无用功呢.那么如果没有切分,会有一个随之而来的问题,怎么从索引库里面提取未切分的字符串呢?这牵扯到索引的问题,我觉得百度应该采取了两套索引机制,一种是按照单词索引,一种是按照N-GRAM索引,至于索引的具体问题,以后在详细论述. &lt;br /&gt;&lt;br /&gt;下面我们看看百度是采取的何种分词算法,现在分词算法已经算是比较成熟了,有简单的有复杂的,比如正向最大匹配,反向最大匹配,双向最大匹配,语言模型方法,最短路径算法等等,有兴趣的可以用GOOGLE去搜索一下以增加理解.这里就不展开说了.但是要记住一点的是:判断一个分词系统好不好,关键看两点,一个是消除歧义能力;一个是词典未登录词的识别比如人名,地名,机构名等. &lt;br /&gt;&lt;br /&gt;那么百度用的是什么方法?我的判断是用双向最大匹配算法.至于怎么推理得出的,让我们一步步来看.当然,这里首先有个假设,百度不会采取比较复杂的算法,因为考虑到速度问题. &lt;br /&gt;&lt;br /&gt;我们提交一个查询”***北京华烟云”,又一个不知所云的查询,尽管不知所云但是自有它的道理,我想看看百度的分词是如何消歧以及是否有词典未登录词的识别的功能,如果是正向最大匹配算法的话,那么输出应该是:”***/北京/华/烟云”,如果是反向最大匹配算法的话,那么输出应该是:”毛/泽/东北/京华烟云”,我们看看百度的分词结果:”***/北/京华烟云”,一个很奇怪的输出,跟我们的期望相差较多,但是从中我们可以获得如下信息:百度分词可以识别人名,也可以识别”京华烟云”,这说明有词典未登录词的识别的功能,我们可以假设分词过程分为两个阶段:第一阶段,先查找一个特殊词典,这个词典包含一些人名,部分地名以及一些普通词典没有的新词,这样首先将”***”解析出来,剩下了字符串”北京华烟云”,而”北/京华烟云”,可以看作是反向最大匹配的分词结果.这样基本说得通.为了证明这一点,我们提交查询”发***北”,我们期望两种分词结果,一个是正向最大匹配&lt;发毛,泽,东北&gt;,一个是上述假设的结果&lt;发,***,北&gt;,事实上百度输出是第二种情况,这样基本能确定百度分词采取了至少两个词典,一个是普通词典,一个是专用词典(人名等).而且是专用词典先切分,然后将剩余的片断交由普通词典来切分. &lt;br /&gt;&lt;br /&gt;继续测验,提交查询”古巴比伦理”,如果是正向最大匹配,那么结果应该是&lt;古巴比伦,理&gt;,如果是反向最大匹配,那么结果应该是&lt;古巴,比,伦理&gt;,事实上百度的分词结果是&lt;古巴比伦,理&gt;,从这个例子看,好像用了正向最大匹配算法;此外还有一些例子表明好像是使用正向最大匹配的;但是且慢,我们看这个查询”北京华烟云”,正向最大匹配期望的结果是&lt;北京,华,烟云&gt;,而反向最大匹配期望的结果是&lt;北,京华烟云&gt;,事实上百度输出的是后者,这说明可能采用的反向最大匹配;从这点我们可以猜测百度采用的是双向最大匹配分词算法,如果正向和反向匹配分词结果一致当然好办,直接输出即可;但是如果两者不一致,正向匹配一种结果,反向匹配一种结果,此时该如何是好呢?从上面两个例子看,在这种情况下,百度采取最短路径方法,也就是切分的片断越少越好,比如&lt;古巴,比,伦理&gt;和&lt;古巴比伦,理&gt;相比选择后者,&lt;北京,华,烟云&gt;和&lt;北,京华烟云&gt;相比选择后者.还有类似的一些例子,这样基本可以解释这些输出结果. &lt;br /&gt;&lt;br /&gt;但是仍然遗留的问题是:如果正向反向分词不一致,而且最短路径也相同,那怎么办?输出正向的还是反向的结果?我们再来看一个例子.提交查询”遥远古古巴比伦”,这个查询被百度切分为&lt;遥远,古古,巴比伦&gt;,说明词典里面有”巴比伦”,但是是否有”古巴比伦”这个词汇不确定,此时看不出是正向切分还是反向切分得出的结果,换查询为”遥远古巴比伦”,此时被切分为”遥远/古巴比伦”,这说明词典里面有”古巴比伦”这个词汇,这说明了”遥远古古巴比伦”是正向最大匹配的结果.那为什么”遥远古古巴比伦”不会被反向切分为”遥/远古/古巴比伦”呢,百度的可能选择是这种情况下选择单字少的那组切分结果. &lt;br /&gt;&lt;br /&gt;当然还可以继续追问:如果切分后单字也一样多,那怎么办?最后看一个例子,查询”王强大小:”,百度将其切分为”王/强大/小”,是正向切分的结果,如果是反向的会被切分为”王/强/大小”,这说明有歧义而且单字也相同则选择正向切分结果. &lt;br /&gt;&lt;br /&gt;OK,看到这里可能头已经有些晕了,最后总结一下百度的分词算法,当然里面还是有猜测的成分,算法如下: &lt;br /&gt;&lt;br /&gt;首先查询专用词典(人名,部分地名等),将专有名称切出,剩下的部分采取双向分词策略,如果两者切分结果相同,说明没有歧义,直接输出分词结果.如果不一致,则输出最短路径的那个结果,如果长度相同,则选择单字词少的那一组切分结果.如果单字也相同,则选择正向分词结果.. &lt;br /&gt;&lt;br /&gt;百度一直宣传自己在中文处理方面的优势,从上面看,分词算法并无特殊之处,消歧效果并不理想,即使百度采取比上述分词算法复杂些的算法也难以说成是优势,如果说百度有优势的话,唯一的优势就是那个很大的专用词典,这个专用词典登录了人名(比如大长今),称谓(比如老太太),部分地名(比如阿联酋等),估计百度采用学术界公布的比较新的命名实体识别算法从语料库里面不断识别出词典未登录词,逐渐扩充这个专门词典.如果这就是优势的话,那么这个优势能够保持多久就是个很明显的问题.&lt;br /&gt;baidu分词算法分析之二&lt;br /&gt;版主实习中，争取转正。大家多多支持 ：） &lt;br /&gt;------------------------------------------------------------ &lt;br /&gt;接《百度分词算法分析一》 &lt;br /&gt;Spelling Checker拼写检查错误提示(以及拼音提示功能) &lt;br /&gt;　　 &lt;br /&gt;拼写检查错误提示是搜索引擎都具备的一个功能,也就是说用户提交查询 给搜索引擎,搜索引擎检查看是否用户输入的拼写有错误,对于中文用户来说一般造成的错误是输入法造成的错误.那么我们就来分析看看百度是 怎么实现这一功能的. &lt;br /&gt;　　我们分析拼写检查系统关注以下几个问题: &lt;br /&gt;　　(1)系统如何判断用户的输入是有可能发生错误的查询呢? &lt;br /&gt;　　(2)如果判断是可能错误的查询输入,如何提示正确的词汇呢? &lt;br /&gt;　　 &lt;br /&gt;　　那么百度是如何做的呢?百度判断用户输入是否错误的 标准,我觉得应该是查字典,如果发现字典里面不包含这个词汇,那么很有可能是个错误的输入,此时启动错误提示功能,这个很好判断,因为如果 是一个正常词汇的话,百度一般不会有错误提示,而你故意输入一个词典不可能包含的所谓词汇,此时百度一般会提示你正确的检索词汇. &lt;br /&gt;　 　那么百度是怎么提示正确词汇的呢?很明显是通过拼音的方式,比如我输入查询" 制才",百度提供的提示词汇为: “:制裁 质材 纸材",都是同 音字.所以百度必然维持着一个同音词词典,里面保留着同音词信息,比如可能包含着下面这条词条: “ zhi cai à制裁,质材,纸材",另外还有一 个标注拼音程序,现在能够看到的基本流程是: 用户输入" 制才",查词典,发现没有这个词汇,OK,启动标注拼音程序,将" 制才"标注为拼音"zhi cai",然后查找同音词词典,发现同音词" 制裁,质材,纸材",那么提示用户可能的正确拼写. &lt;br /&gt;　　整体流程看起来很简单,但是还有一些遗留 的小问题,比如是否将词表里面所有同音词都作为用户的提示信息呢?比如某个拼音有10个同音词,是否都输出呢?百度并没有将所有同音词都输 出而是选择一定筛选标准,选择其中几个输出.怎么证明这一点?我们看看拼音"liu li"的同音词,紫光输入法提示同音词汇有" 流丽 流离 琉璃 流利"4个,我们看看百度返回几个,输入"流厉"作为查询,这里是故意输入一个词典不包含的词汇,这样百度的拼写检查才开始工作,百度提示: " 琉璃刘丽 刘莉 ",这说明什么?说明不是所有同音词都输出,而是选择输出,那么选择的标准是什么?我能够猜测到的方法是对于用户查询LOG进行 统计,提取用户查询次数多的那些同音词输出,如果是这样的话,上面的例子说明用户搜索"琉璃"次数比其它的都要高些,次之是" 刘丽",再次是" 刘莉",看来大家都喜欢查询自己或者认识的人的名字. &lt;br /&gt;　　另外一个小问题:同音词词典包含2字词,3字词,那么是否包含4字词以及更长的词 条?是否包含一字词? 这里一字词好回答,不用测试也能知道肯定不包含,因为你输入一个字,谁知道是否是错误的呢?反正只要是汉字就能在词表 里面找到,所以没有判断依据.二字词是包含的,上面有例子,三字词也包含,比如查询 "中城药"百度错误提示:"中成药",修改查询为"重城药",还 是提示"中成药" ,再次修改查询 "重城要",百度依然提示"中成药". 那么4字词汇呢? &lt;br /&gt;　　百度还是会给你提示的,下面是个例子: &lt;br /&gt;　　输入:静华烟云 提示 京华烟云 &lt;br /&gt;　　输入:静话烟云 提示 京华烟云 &lt;br /&gt;　　输入:静话阎晕 提示 京华烟云 &lt;br /&gt;　　那么更长的词汇是否提 示呢?也提示,比如我输入: "落花世界有风军",这个查询是什么意思,估计读过古诗的都知道,看看百度的提示"落花时节又逢君",这说明什么?说 明同音词词典包含不同长度的同音词信息,另外也说明了百度的核心中文处理技术,也就是那个词典,还真挺大的. &lt;br /&gt;　　但是,如果用户输入的 查询由两个或者两个以上子字符串构成,那么百度的错误提示功能就罢工了,比如输入查询"哀体",百度提示"艾提 挨踢",但是.输入为 "我 哀体 ",则没有任何错误提示. &lt;br /&gt;　　还有一个比较重要的问题:如果汉字是多音字那么怎么处理?百度呢比较偷懒,它根本就没有对多音字做处理.我 们来看看百度的一个标注拼音的错误,在看这个错误前先看看对于多音字百度是怎么提示错误的,我们输入查询"俱长",百度提示"剧场 局长", “俱长"的拼音有两个:"ju zhang /ju chang" ,可见如果是多音字则几种情况都提示..现在我们来看看错误的情况, 我们输入查询"剧常",百度 提示":剧场局长",提示为"剧场"当然好解释,因为是同音字,但是为什么 "局长"也会被提示呢?这说明百度的同音字词典有错误,说明在"ju chang"这个词条里面包含"局长"这个错误的同音词.让我们顺藤摸瓜,这个错误又说明什么问题呢?说明百度的同音词典是自动生成的,而且没有 人工校对.还说明在自动生成同音词典的过程中,百度不是根据对一篇文章标注拼音然后在抽取词汇和对应的拼音信息获得的,而是完全按照某个 词典的词条来标注音节的,所以对于多音字造成的错误无法识别出来,如果是对篇章进行拼音标注,可能就不会出现这种很容易发现的错误标注. 当然还有另外一种解释,就是"局长"是故意被百度提示出来可能的正确提示词汇,因为考虑到南方人"zh"和 "ch"等前后鼻音分不清么,那么是这 样的么?我们继续测试到底是何种情况.是百度有错误还是这是百度的先进的算法? &lt;br /&gt;　　我们考虑词汇"长大 ",故意错误输入为"赃大",如果 百度考虑到了前后鼻音的问题,那么应该会提示"长大",但是百度提示是"藏大".这说明什么?说明百度并没有考虑前后鼻音问题,根本就是系统错 误. 我们输入查询"悬赏",故意将之错误输入为"悬桑",没有错误提示,说明确实没有考虑这种情况.前鼻音没有考虑,那么后鼻音考虑了么,我们 输入":经常",故意改为后鼻音 "经缠",百度提示为"经产 经忏",还是没有考虑后鼻音.这基本可以确定是百度系统的错误导致. &lt;br /&gt;　　根据以 上推导, 我们可以得出如下结论:百度是将分词词典里面每个词条利用拼音标注程序标注成拼音,然后形成同音词词典,所以两个词典是同样大的 ,而且这个词典也随着分词词典的增长而在不断增长. 至于标注过程中多音字百度没有考虑,如果是多音字就标注成多个发音组合,通过这种方式 形成同音词词典.这样的同音词词典显然包含着很多错误. &lt;br /&gt;　　最后一个问题:百度对于英文进行拼写检查么?让我们试试看,输入查 询"china",不错,搜到不少结果,专注中文搜索的百度还能搜索到英文,真是意外的惊喜.变换一下查询"chine",会更加意外惊喜的给我们提 示"china"吗?百度提示的是: 吃呢持呢,原来是不小心触发了百度的拼音搜索功能了.那么拼音搜索和中文检查错误是否采用同一套同音词词典 呢,让我们来实验一下,搜索"rongji",百度提示" 榕基 溶剂 容积",OK,换个中文查询"容机",百度提示" 榕基 溶剂容积",看来使用的是同一套 同音词词典.也就是说百度的中文纠错和拼音检索使用的机制相同,中文纠错多了一道拼音注音的过程而已.难道这就是传说中那个百度的"事实 上是一个无比强大的拼音输入法"的拼音提示功能么? &lt;br /&gt;　　最后让我们总结归纳一下百度的拼写检查系统: &lt;br /&gt;　　后台作业: (1)前面的文 章我们说过,百度分词使用的词典至少包含两个词典一个是普通词典,另外一个是专用词典(专名等),百度利用拼音标注程序依次扫描所有词典中 的每个词条,然后标注拼音,如果是多音字则把多个音都标上,比如"长大",会被标注为"zhang da/chang da"两个词条. &lt;br /&gt;　　(2)通过标注完的 词条,建立同音词词典,比如上面的"长大",会有两个词条: zhang daà长大" , chang daà长大. &lt;br /&gt;　　(3)利用用户查询LOG频率信息给予每个 中文词条一个权重; &lt;br /&gt;　　(4)OK,同音词词典建立完成了,当然随着分词词典的逐步扩大,同音词词典也跟着同步扩大; &lt;br /&gt;　　 &lt;br /&gt;　　拼写 检查: &lt;br /&gt;　　(1)用户输入查询,如果是多个子字符串,不作拼写检查; &lt;br /&gt;　　(2)对于用户查询,先查分词词典,如果发现有这个单词词条,OK, 不作拼写检查; &lt;br /&gt;　　(3)如果发现词典里面不包含用户查询,启动拼写检查系统;首先利用拼音标注程序对用户输入进行拼音标注; &lt;br /&gt;　　 (4)对于标注好的拼音在同音词词典里面扫描,如果没有发现则不作任何提示; &lt;br /&gt;　　(5)如果发现有词条,则按照顺序输出权重比较大的几个提 示结果; &lt;br /&gt;　　 &lt;br /&gt;　　拼音提示: &lt;br /&gt;　　(1)对于用户输入的拼音在同音词词典里面扫描,如果没有发现则不作任何提示; &lt;br /&gt;　　(2)如果 发现有词条,则按照顺序输出权重比较大的几个提示结果;&lt;br /&gt;baidu分词算法分析之三&lt;br /&gt;分词系列最后一章 &lt;br /&gt;------------------ &lt;br /&gt;之三:对百度分词算法的进一步分析 &lt;br /&gt;&lt;br /&gt;上面说过,经过分析得出百度的分词系统采用双向最大匹配分词,但是后来发现推理过程中存在一个漏洞,而且推导出来的百度分词算法步骤还是过于繁琐,所以进一步进行分析,看看是否前面的推导有错误. &lt;br /&gt;&lt;br /&gt;那么以前的分析有什么漏洞呢?我们推导百度分词有反向最大匹配的依据是百度将"北京华烟云"分词为&lt;北,京华烟云&gt;,从这里看好像采用了反向最大匹配,因为正向最大匹配的结果应该是&lt;北京,华,烟云&gt;,但是由此就推论说百度采用了双向最大匹配还是太仓促了,前面文章我们也讲过,百度有两个词典,一个普通词典,一个专有词典,而且是专有词典的词汇先切分,然后将剩余片断交给普通词典去切分.所以上面的"北京华烟云"之所以被切分成&lt;北,京华烟云&gt;,另外一个可能是:京华烟云这个词汇是在专有词典里面存储的,所以先分析,这样得出"京华烟云",剩下"北",没什么好切分的,所以输出&lt;北,京华烟云&gt;. &lt;br /&gt;&lt;br /&gt;这里只是假设,那么是否确实"京华烟云"在专有词典呢?我们再看一个例子"山东北京华烟云",百度切分的结果是&lt;山东,北,京华烟云&gt;,如果"京华烟云"在普通词典,如果是反向切分,那么结果应该是&lt;山,东北,京华烟云&gt;,如果是正向切分应该是&lt;山东,北京,华,烟云&gt;,无论如何都分不出&lt;山东,北,京华烟云&gt;.这说明什么?说明"京华烟云"是在那个专有词典,所以先切分出"京华烟云",然后剩下的"山东北"交由普通词典切分,明显是正向最大匹配的结果输出&lt;山东,北&gt;.当然按照我们在第一篇文章的算法推导"山东北"的切分也会得出&lt;山东,北&gt;的结论,但是明显比正向最大匹配多几个判断步骤,既然效果一样,另外一个更加简洁的方法也能说得通,那当然选择简便的方法了.所以初步判断百度采取的是正向最大匹配. &lt;br /&gt;&lt;br /&gt;我们继续测试采用何种分词算法,为了减少专有词典首先分词造成的影响,那么查询里面不能出现相对特殊的词汇,构筑查询"天才能量级",这里应该没有专有词典出现过的词汇,百度切分为&lt;天才,能量,级&gt;,看来是正向最大匹配的结果.另外,如果所有查询词汇都出现在专有词典,那么采取的是何种方法?这样首先就得保证词汇都出现在专有词典,这么保证这一点呢?我们构造查询"铺陈晓东方",百度切分为&lt;铺,陈晓东,方&gt;,可以看出"陈晓东"是在专有词典的所以先切分出来.另外一个例子 "山东京城",百度切分为&lt;山东,京城&gt;,说明"东京"是在普通词典的.OK,构造查询"陈晓东京华烟云",通过前面分析可以看出两个词汇都在专有词典里面,百度切分为&lt;陈晓东,京华烟云&gt;,说明对于专有词典词汇也是采取正向最大匹配或者双向最大匹配.那么使用反向最大匹配了吗?构造查询例子"陈晓东方不败",首先我们肯定"陈晓东"和"东方不败"都是在专有词典出现的,如果是正向切分,那么应该是&lt;陈晓东,方,不败&gt;或者&lt;陈晓东,方,不,败&gt;如果是反向切分则是&lt;陈,晓,东方不败&gt;,可以看出百度的切分是&lt;陈晓东,方,不败&gt;或者&lt;陈晓东,方,不,败&gt;,说明采用的是正向最大匹配.通过分析,百度的词典不包含"不败"这个单词,所以实际上百度的切分结果是&lt;陈晓东,方,不,败&gt;,很明显这和我们以前推导的算法是有矛盾的,所以以前的分析算法确实有问题,所以结论是百度采取的是正向最大匹配算法. &lt;br /&gt;&lt;br /&gt;重新归纳一下百度的分词系统:首先用专有词典采用最大正向匹配分词,切分出部分结果,剩余没有切分交给普通词典,同样采取正向最大匹配分词,最后输出结果. &lt;br /&gt;&lt;br /&gt;另外,GOOGLE也是采用正向最大匹配分词算法,不过好像没有那个专用词典,所以很多专名都被切碎了. &lt;br /&gt;&lt;br /&gt;从这点讲,GOOGLE在中文词典构建上比百度差些,还需要加把子力气才行,不过这也不是什么多难的事.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-2075601631530081769?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/2075601631530081769/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=2075601631530081769' title='33 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/2075601631530081769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/2075601631530081769'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2010/05/blog-post.html' title='分词技术'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-6655925992803547733</id><published>2010-04-03T22:55:00.000-07:00</published><updated>2010-04-03T22:56:18.992-07:00</updated><title type='text'>Cygwin 使用</title><content type='html'>Using MinGW-w64 for 64bit applications on 64bit Windows.&lt;br /&gt;1. 前言 &lt;br /&gt;使用 MinGW-w64 的工具與程式庫來編寫 64 位元程式，只要透過 Cygwin 其實非常簡單。&lt;br /&gt;&lt;br /&gt;但如前文所述，Cygwin 目前只能編譯 32 位元的程式，使用的是 GCC 3.4.4 的版本，編譯的概念是 MinGW 與 Cygwin 程式庫二選一。&lt;br /&gt;&lt;br /&gt;這裡要做的，則是將 Cygwin ，MinGW，MinGW-w64 視為不同的平台，以 cross compiler 的概念來進行編譯，分為三個步驟。&lt;br /&gt;&lt;br /&gt;第一，重新安裝 Cygwin 的GCC為 4.3.4版本，可以呼叫 POSIX API 與 Windows API，但是執行時需要 cygwin1.dll。&lt;br /&gt;&lt;br /&gt;第二，安裝 MinGW 來編譯 32 位元程式，編譯出來的是一般 Windows 32位元執行檔。&lt;br /&gt;&lt;br /&gt;第三，安裝 MinGW-w64 來編譯 64 位元程式，編譯出來的是一般 Windows 64位元執行檔。&lt;br /&gt;&lt;br /&gt;2. 重新安裝 Cygwin&lt;br /&gt;&lt;br /&gt;要更新 Cygwin 的 GCC 為 4.3.4 版本，直接移除 c:\cygwin 這個目錄比較快，但是記得備份 c:\cygwin\home\Administrator 目錄下的檔案。&lt;br /&gt;&lt;br /&gt;安裝的過程，請參考前文，到了套件選擇的步驟時，選擇 file, gcc4-core， gcc4-g++, make, vim 。&lt;br /&gt;&lt;br /&gt;安裝完成後，進入 bash 輸入：&lt;br /&gt;&lt;br /&gt;$ cc -v&lt;br /&gt;Using built-in specs.&lt;br /&gt;Target: i686-pc-cygwin&lt;br /&gt;Configured with: /gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4/&lt;br /&gt;configure --srcdir=/gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.&lt;br /&gt;4 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin &lt;br /&gt;(略)&lt;br /&gt;Thread model: posix&lt;br /&gt;gcc version 4.3.4 20090804 (release) 1 (GCC)&lt;br /&gt;&lt;br /&gt;可知這次 GCC 版本為 4.3.4， 編譯目標為 i686-pc-cygwin。&lt;br /&gt;&lt;br /&gt;以 a.c 為例，編譯出來的檔案，可以使用 file 來測試， 輸入：&lt;br /&gt;&lt;br /&gt;$ file a.exe&lt;br /&gt;a.exe: PE32 executable for MS Windows (console) Intel 80386 32-bit&lt;br /&gt;&lt;br /&gt;可知為 PE 格式執行檔，但在檔案管理員中點選執行時，會產生找不到 cygwin1.dll 的錯誤，原因如前文所述。&lt;br /&gt;&lt;br /&gt;另外，可以使用 objdump 反組譯來查看， 輸入：&lt;br /&gt;&lt;br /&gt;$ objdump -d a.exe | grep '%esp,%ebp'&lt;br /&gt;401001: 89 e5 mov %esp,%ebp&lt;br /&gt;(略)&lt;br /&gt;&lt;br /&gt;可知使用的是 32 位元暫存器。&lt;br /&gt;&lt;br /&gt;這時候，如果要使用 -mno-cygwin 是不行的, 以 b.c 為例：&lt;br /&gt;&lt;br /&gt;$ cc -o b b.c -mno-cygwin -mwindows&lt;br /&gt;cc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler.&lt;br /&gt;&lt;br /&gt;3. 安裝 MinGW &lt;br /&gt;接下來到 http://mingw-w64.sourceforge.net/ 下載 mingw-w64-bin_i686-mingw_20100123_sezero.zip ，將壓縮檔內的 mingw32 目錄解壓縮到 c:\目錄內， 然後在 bash 內 輸入：&lt;br /&gt;&lt;br /&gt;$ ln -s /cygdrive/c/mingw32 /mingw32&lt;br /&gt;&lt;br /&gt;這個步驟讓我們能夠使用 /mingw32/bin/gcc 來進行編譯，輸入：&lt;br /&gt;&lt;br /&gt;$ /mingw32/bin/gcc -v&lt;br /&gt;Using built-in specs.&lt;br /&gt;Target: i686-w64-mingw32&lt;br /&gt;Configured with: ../gcc44-svn/configure --target=i686-w64-mingw32 --host=i686-w6&lt;br /&gt;4-mingw32 --disable-multilib --disable-nls --disable-win32-registry --prefix=/mi&lt;br /&gt;ngw32 --with-sysroot=/mingw32 --with-gmp=/mingw32 --with-mpfr=/mingw32 --enable-&lt;br /&gt;languages=c,c++&lt;br /&gt;Thread model: win32&lt;br /&gt;gcc version 4.4.3 (GCC)&lt;br /&gt;&lt;br /&gt;可知編譯目標為 i686-w64-mingw32。&lt;br /&gt;&lt;br /&gt;以檔案 b.c 為例，輸入：&lt;br /&gt;&lt;br /&gt;$ /mingw32/bin/gcc -o b b.c -mwindows&lt;br /&gt;&lt;br /&gt;完成編譯後，以使用 file 來測試， 輸入：&lt;br /&gt;&lt;br /&gt;$ file b.exe&lt;br /&gt;b.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit&lt;br /&gt;&lt;br /&gt;可知為 32 位元 PE 執行檔。&lt;br /&gt;&lt;br /&gt;使用 objdump 反組譯來查看， 輸入：&lt;br /&gt;&lt;br /&gt;$ /mingw32/bin/objdump -d b.exe | grep '%esp,%ebp'&lt;br /&gt;401001: 89 e5 mov %esp,%ebp&lt;br /&gt;(略)&lt;br /&gt;&lt;br /&gt;可知使用的是 32 位元暫存器。&lt;br /&gt;&lt;br /&gt;4. 安裝 MinGW-w64&lt;br /&gt;&lt;br /&gt;接下來到 http://mingw-w64.sourceforge.net/ 下載 mingw-w64-bin_x86_64-mingw_20100123_sezero.zip ，將壓縮檔內的 mingw64目錄解壓縮到 c:\目錄內。&lt;br /&gt;&lt;br /&gt;製作 /mingw64 連結, 在 bash 內 輸入：&lt;br /&gt;&lt;br /&gt;$ ln -s /cygdrive/c/mingw64 /mingw64&lt;br /&gt;&lt;br /&gt;這個步驟讓我們能夠使用 /mingw/mingw64/bin/gcc 來進行編譯，輸入：&lt;br /&gt;&lt;br /&gt;$ /mingw64/bin/gcc -v&lt;br /&gt;Using built-in specs.&lt;br /&gt;Target: x86_64-w64-mingw32&lt;br /&gt;Configured with: ../gcc44-svn/configure --target=x86_64-w64-mingw32 --host=x86_6&lt;br /&gt;4-w64-mingw32 --disable-multilib --disable-nls --disable-win32-registry --prefix&lt;br /&gt;=/mingw64 --with-sysroot=/mingw64 --with-gmp=/mingw64 --with-mpfr=/mingw64 --ena&lt;br /&gt;ble-languages=c,c++&lt;br /&gt;Thread model: win32&lt;br /&gt;gcc version 4.4.3 (GCC)&lt;br /&gt;&lt;br /&gt;可知編譯目標為 x86_64-w64-mingw32。&lt;br /&gt;&lt;br /&gt;以檔案 b.c 為例，輸入：&lt;br /&gt;&lt;br /&gt;$ /mingw64/bin/gcc -o b b.c -mwindows&lt;br /&gt;&lt;br /&gt;完成編譯後，以使用 file 來測試， 輸入：&lt;br /&gt;&lt;br /&gt;$ file b.exe&lt;br /&gt;b.exe: PE32+ executable for MS Windows (GUI)&lt;br /&gt;&lt;br /&gt;可知為 64 位元 PE 執行檔。&lt;br /&gt;&lt;br /&gt;使用 objdump 反組譯來查看， 輸入：&lt;br /&gt;&lt;br /&gt;$ /mingw64/bin/objdump -d b.exe|grep '%rsp,%rbp'&lt;br /&gt;401731: 48 89 e5 mov %rsp,%rbp&lt;br /&gt;(略)&lt;br /&gt;&lt;br /&gt;可知使用的是 64 位元暫存器。&lt;br /&gt;&lt;br /&gt;5. 使用 GNU as 編寫 64 位元組合語言&lt;br /&gt;&lt;br /&gt;安裝完 MinGW-w64 後，可以直接使用 /mingw64/bin/gcc 來組譯 GNU as 語法的 64位元組合語言。&lt;br /&gt;&lt;br /&gt;舉例來說， 將下面的文字複製為 d.s 檔案：&lt;br /&gt;&lt;br /&gt;  .globl _main&lt;br /&gt;.data&lt;br /&gt;  str: .string "hello"&lt;br /&gt;.text&lt;br /&gt;_main:&lt;br /&gt;  lea  str, %rcx&lt;br /&gt;  call _printf&lt;br /&gt;  ret&lt;br /&gt;&lt;br /&gt;之後輸入：&lt;br /&gt;&lt;br /&gt;$ /mingw64/bin/gcc -o d d.s&lt;br /&gt;&lt;br /&gt;即可組譯 d.s 為執行檔 d.exe， 輸入以下指令可執行&lt;br /&gt;&lt;br /&gt;$ ./d&lt;br /&gt;hello&lt;br /&gt;&lt;br /&gt;6. 使用 ML64 編寫 64 位元組合語言&lt;br /&gt;&lt;br /&gt;目前(2010) 並沒有 Masm615 這類隨書附贈的 64 位元 MASM 語法組譯器，不嫌麻煩的話，可以使用 Visual Studio 提供的 ML64 來進行組譯：&lt;br /&gt;&lt;br /&gt;a) 安裝 Microsoft Visual Studio 2008， 完成加入這個連結：&lt;br /&gt;&lt;br /&gt;$ ln -s '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin/amd64' /vc&lt;br /&gt;&lt;br /&gt;並且複製 libcmt.lib 這個檔案到工作目錄。&lt;br /&gt;&lt;br /&gt;$ cp '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 9.0/VC/lib/amd64/libcmt.lib' .&lt;br /&gt;&lt;br /&gt;b) 安裝 Microsoft SDK， 完成後複製 Kernel32.lib 到工作目錄。&lt;br /&gt;&lt;br /&gt;$ cp '/cygdrive/c/Program Files/Microsoft SDKs/Windows/v6.0A/Lib/x64/Kernel32.lib' .&lt;br /&gt;&lt;br /&gt;之後編寫以下程式為 e.asm 來進行測試：&lt;br /&gt;&lt;br /&gt;printf PROTO&lt;br /&gt;.data&lt;br /&gt;s BYTE "hello",0&lt;br /&gt;.code&lt;br /&gt;main proc&lt;br /&gt;  lea rcx, s&lt;br /&gt;  call printf&lt;br /&gt;  ret&lt;br /&gt;main endp&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;輸入以下指令來組譯：&lt;br /&gt;&lt;br /&gt;$ /vc/ml64 -c e.asm&lt;br /&gt;$ /vc/link e.obj libcmt.lib Kernel32.lib&lt;br /&gt;&lt;br /&gt;即可組譯 e.asm 為執行檔 e.exe， 輸入以下指令可執行&lt;br /&gt;&lt;br /&gt;$ ./e&lt;br /&gt;hello&lt;br /&gt;&lt;br /&gt;7. 總結&lt;br /&gt;&lt;br /&gt;以 MinGW-w64，GNU as，或是 ML64 來編寫 64位元 C 語言或是組合語言非常方便， 提供給修習計算機組織的同學參考。&lt;br /&gt;&lt;br /&gt;另外，64 位元與32位元呼叫 API 時的 ABI(Application Binary Interface) 差異很大, 要稍微留意。&lt;br /&gt;&lt;br /&gt;Eih-Zhe Liang&lt;br /&gt;ezliang@mail.dwu.edu.tw&lt;br /&gt;cygwin下dll和lib的生成方法&lt;br /&gt;&lt;br /&gt;luckythc | 03 四月, 2008 16:44&lt;br /&gt;&lt;br /&gt;cygwin可以编译生成windows下供调用的dll,包括vc可识别的lib。&lt;br /&gt;&lt;br /&gt;Cygwin-GCC : Cygwin自带了一个GCC,　用于把C/C++-Source编译成Cygwin平台下的EXE/DLL (使用Cygwin必须用其自带的GCC, 因为内部会生成一些针对于平台的特定的初始化代码，　如果用其余版本的GCC则很有可能导致程序不能正常运行．)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cygwin-GCC : Cygwin自带了一个GCC,　用于把C/C++-Source编译成Cygwin平台下的EXE/DLL (使用Cygwin必须用其自带的GCC, 因为内部会生成一些针对于平台的特定的初始化代码，　如果用其余版本的GCC则很有可能导致程序不能正常运行．)&lt;br /&gt;&lt;br /&gt;说明 - Cygwin-GCC :&lt;br /&gt;&lt;br /&gt;在Cygwin-Shell中可直接使用gcc .　如下 :&lt;br /&gt;&lt;br /&gt;gcc -shared xxx.c -o xxx.dll //编译成DLL, 注意，　Cygwin-GCC默认导出所有的Function.&lt;br /&gt;&lt;br /&gt;gcc -c xxx.c -o xxx.o //编译成OBJ&lt;br /&gt;&lt;br /&gt;gcc xxx.c -o xxx.exe //编译成EXE&lt;br /&gt;&lt;br /&gt;ar r xxx.lib xxx1.o xxx2.o //打包多个obj成一个Lib (非连接)&lt;br /&gt;&lt;br /&gt;gcc xxx.c ./L aaa.dll -o xxx.exe //引用外部DLL生成EXE&lt;br /&gt;&lt;br /&gt;gcc xxx.c yyy.c -o zzz.exe //连接多个C文件，　生成EXE.&lt;br /&gt;&lt;br /&gt;gcc -I"/bin/include"　-c xxx.c -o xxx.o //引用/bin/include目录下头文件，生成OBJ&lt;br /&gt;&lt;br /&gt;gcc -L"dll.a" xxx.c -o xxx.exe //连接dll.a，　生成EXE&lt;br /&gt;&lt;br /&gt;如果想知道编译时具体的信息，　可以使用--verbose这个编译选项，　对于了解GCC的工作是很有帮助的．&lt;br /&gt;&lt;br /&gt;额外的，也可以写自己的导出Lib文件，　以方便其余程序引用DLL (如Cobol2002编译器就不支持直接引用DLL, 这个时候可以写一个Def，　并导出Lib文件，　便于Cobol2002使用)&lt;br /&gt;&lt;br /&gt;具体方法如下：&lt;br /&gt;&lt;br /&gt;1. 编译生成DLL :&lt;br /&gt;&lt;br /&gt;如： gcc -shared MyTest.c -o MyTest.dll, 生成MyTest.dll.&lt;br /&gt;&lt;br /&gt;2. 写一个DEF文件 (这里是MyTest.def)，　简单的格式大致如下：&lt;br /&gt;&lt;br /&gt;LIBRARY MyTest //这里的MyTest对应于MyTest.dll&lt;br /&gt;EXPORTS&lt;br /&gt;AllocMemory @1 //导出的第一个function : 对应于MyTest.dll里面的AllocMemory(...), 注意，　参数可不用写&lt;br /&gt;ReadMemory @2 //导出的第二个function : 对应于MyTest.dll里面的ReadMemory-Function.&lt;br /&gt;&lt;br /&gt;//注意：　function可以不用全部导出，　可以只选择你需要的Function.&lt;br /&gt;&lt;br /&gt;3. 用LIB工具（VC6有提供）生成LIB文件 (这里是MyTest.lib) :&lt;br /&gt;&lt;br /&gt;lib /def:MyTest.def //默认生成的名称为MyTest.lib.&lt;br /&gt;&lt;br /&gt;4. 到此生成完毕，　连接的时候只需要引用MyTest.lib即可，　但要注意XXX.exe 和MyTest.dll要放在同一目录下．&lt;br /&gt;&lt;br /&gt;可以用 gcc --help 查看具体的命令 etc..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-6655925992803547733?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/6655925992803547733/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=6655925992803547733' title='4 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6655925992803547733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6655925992803547733'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2010/04/cygwin.html' title='Cygwin 使用'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-4144132664899527387</id><published>2009-12-12T05:12:00.000-08:00</published><updated>2009-12-12T05:13:14.319-08:00</updated><title type='text'>first</title><content type='html'>昨天 12.11&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-4144132664899527387?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/4144132664899527387/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=4144132664899527387' title='5 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4144132664899527387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4144132664899527387'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2009/12/first.html' title='first'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-7836429468592072477</id><published>2009-08-12T05:21:00.000-07:00</published><updated>2009-08-12T05:23:40.073-07:00</updated><title type='text'>Grammer checking project</title><content type='html'>1. open office project:&lt;br /&gt;From: http://lingucomponent.openoffice.org/grammar.html&lt;br /&gt;start:&lt;br /&gt;Lingucomponent Sub-Project: Grammar Checking&lt;br /&gt;&lt;br /&gt;One of the goals of the Lingucomponent project is to design, develop, and implement a Grammar checker for English and other supported languages.&lt;br /&gt;News&lt;br /&gt;&lt;br /&gt;    * October 2008: A grammar checking API is now part of OpenOffice.org 3.0. LanguageTool now makes use of this new API which allows on-the-fly checking, i.e. checking text while you type. More information about the API is available at the following sources:&lt;br /&gt;          o Grammar Checking page in Wiki&lt;br /&gt;          o Specification (.odt)&lt;br /&gt;          o All grammar checker issues&lt;br /&gt;&lt;br /&gt;If you have any interest in helping to implement a grammar checker for the OpenOffice.org project, please subscribe to the mailing list dev@lingucomponent.openoffice.org and introduce yourself, your skills, and your willingness to help this project.&lt;br /&gt;Links to Open Source grammar checkers&lt;br /&gt;&lt;br /&gt;    * An Gramadóir, a grammar checker for the Irish language&lt;br /&gt;    * CoGrOO, a grammar checker for Portuguese&lt;br /&gt;    * GRAC, corpus-based grammar checker written in Python&lt;br /&gt;    * graviax, grammar rules and grammar checker for the English language&lt;br /&gt;    * Higgins, a prototype English-language parser&lt;br /&gt;    * LanguageTool, a style and grammar checker with OpenOffice.org integration, for English, German, Polish, Dutch, and other languages&lt;br /&gt;    * Link Grammar, not really a grammar checker but a parser for the English language, also see the link grammar page at AbiWord&lt;br /&gt;&lt;br /&gt;Links to commercial grammar checkers&lt;br /&gt;&lt;br /&gt;    * Cysgliad, a Welsh grammar checker&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Created: 2001 June.   Last Modified: $Date: 2008/11/08 21:32:59 $, $Revision: 1.25 $ &lt;br /&gt;&lt;br /&gt;2. Requirement (not totally true)&lt;br /&gt;From: http://wiki.services.openoffice.org/wiki/Grammar_Checking&lt;br /&gt;Grammar checking of mixed language text&lt;br /&gt;&lt;br /&gt;It is believed that even for sentences that uses several languages there is only a single language the whole sentence is in. (How that language is identified is a completely different matter and probably a complex task though!) And thus that sentence should only be grammar checked in that single language. For example:&lt;br /&gt;&lt;br /&gt;The German word for television is Fernseher.&lt;br /&gt;&lt;br /&gt;This sentence should be grammar checked in English and not German&lt;br /&gt;&lt;br /&gt;If possible though (for example if language attributes are set correctly) it should be noted that Fernseher is not in English and thus at the very least no spelling error should for English should be reported for that word. And probably it is also impossible to report any grammar error that involves embedded foreign words. Thus the best to hope for probably is for the foreign word to be recognized as correct by the respective spell checker.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Even with completely embedded sentence like&lt;br /&gt;&lt;br /&gt;In Gallica Caesar said 'Alea iacta est.' and continued his battle.&lt;br /&gt;&lt;br /&gt;the above text is in a single language English and not Latin. If an existing grammar checker is smart enough to cope with embedded sentences of a different language I don't know. To keep it simple for the time being the whole text should be grammar checked as one sentence in English and in only that language.&lt;br /&gt;Grammar checking and spell checking at the same time&lt;br /&gt;&lt;br /&gt;Should spell checking have an iterator of it's own with a thread of it's own? Or should spell checking be handled by the GrammarCheckingIterator as well?&lt;br /&gt;Other Questions / problems:&lt;br /&gt;&lt;br /&gt;    * checking is limited to paragraphs (unless the implementation of XFlatParagraph chooses to hide sth. more behind it which is unlikely). Though one could think of enumerations as a possible application for this behavior.&lt;br /&gt;    * in the case of several grammar checkers for one languages, what do we do if they report different end-of-sentence positions? We really can't handle each checker individually here.&lt;br /&gt;    * does a grammar checker that requires knowledge of the previous text in this paragraph need to have those text presented even if it is in a language it does not know?&lt;br /&gt;    * How to achieve consistency of usage (e.g. spelling) when having grammar checkers in multiple languages? E.g. e-mail vs. email? Or does it need to be consistent on a per language base only?&lt;br /&gt;    * How to determine the language of a sentence? Use the language of the first word, or language guessing, or the language with the most words,... ?&lt;br /&gt;    * Problems related to a specific UI, namely the grammar checking dialog still to be defined, not yet covered.&lt;br /&gt;    * The troublesome case of having for example three grammar checkers for one language and two of them wanting to use their own dialog while the third will go with the office internal one is left out. Because if all of them report errors in the same sentence and like to use their own dialog as well we will have to cope with switching between three dialogs just to edit a single sentence. That's just plain awful to even think about. And I doubt there will be even one user to appreciate such a scenario.&lt;br /&gt;    * Should the document (e.g. XFlatParagraph) be in charge to determine the language for checking or should it be the GrammarCheckingIterator? Probably the latter...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-7836429468592072477?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/7836429468592072477/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=7836429468592072477' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/7836429468592072477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/7836429468592072477'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2009/08/grammer-checking-project.html' title='Grammer checking project'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-6280624798297341140</id><published>2009-01-19T07:35:00.000-08:00</published><updated>2009-01-19T07:37:30.022-08:00</updated><title type='text'>Top coder</title><content type='html'>假设有这样一种字符串，它们的长度不大于26，而且若一个这样的字符串其长度为&lt;br /&gt;m，则这个字符串必定由a, b, c, . . . , z 中的前m 个字母构成，同时我们保证每个字母出&lt;br /&gt;现且仅出现一次。比方说某个字符串长度为5，那么它一定是由a, b, c, d, e 这5 个字母&lt;br /&gt;构成，不会多一个也不会少一个。嗯嗯，这样一来，一旦长度确定，这个字符串中有哪些&lt;br /&gt;字母也就确定了，唯一的区别就是这些字母的前后顺序而已。&lt;br /&gt;现在我们用一个由大写字母A 和B 构成的序列来描述这类字符串里各个字母的前&lt;br /&gt;后顺序：&lt;br /&gt;1.         如果字母b 在字母a 的后面，那么序列的第一个字母就是A（After），否则序列的&lt;br /&gt;第一个字母就是B（Before）；&lt;br /&gt;2.          如果字母c 在字母b 的后面，那么序列的第二个字母就是A，否则就是B；&lt;br /&gt;3.          如果字母d 在字母c 的后面，那么??不用多说了吧？直到这个字符串的结束。&lt;br /&gt;这规则甚是简单，不过有个问题就是同一个AB 序列，可能有多个字符串都与之相&lt;br /&gt;符，比方说序列"ABA"，就有"acdb"、"cadb" 等等好几种可能性。说的专业一点，这一&lt;br /&gt;个序列实际上对应了一个字符串集合。那么现在问题来了：给你一个这样的AB 序列，&lt;br /&gt;问你究竟有多少个不同的字符串能够与之相符？或者说这个序列对应的字符串集合有多&lt;br /&gt;大？注意，只要求个数，不要求枚举所有的字符串。&lt;br /&gt;注：如果结果大于10 亿就返回-1。&lt;br /&gt;我把题目总结为:给定一个字符串"ABAB..."(以下称为模式串),计算出符合要求的所有"abcd..."字符串(以下称为结果串)的个数.&lt;br /&gt;要解答这个问题,首先需要明确两点(为什么就不要说了吧,呵呵):&lt;br /&gt;1.  如果模式串的长度为n,那么结果串的长度为n+1&lt;br /&gt;2.  一个模式串至少对应一个结果串,一个结果串对应而且只能对应一个模式串&lt;br /&gt;下面我把我的思考过程写出来:&lt;br /&gt;一. 从一个给定的模式串递推出所有的结果串,假设给定的模式串是"ABAB":&lt;br /&gt;     1.对于第一个字母"A",那么结果串只能是"ab"&lt;br /&gt;     2.对于第二个字母"B",说明c在b之前,而b之前有2个空位可以插入,所以可能的结果串是"cab","acb"&lt;br /&gt;     3.对于第三个字母"A",说明d在c之后.在"cab"中,d可以插到3个空位中,可能的结果串是"cdab","cadb","cabd";在"acb"中,d可以插到2个空位中----"acdb","acbd".所以总的可能数是5&lt;br /&gt;     4.对于第四个字母"B",同样的道理可以算出总的可能的结果串有16个.&lt;br /&gt;二. 总结一下刚才的递推过程,可以发现每一次递推只和前一次递推的结果和模式串相应位置的字母有关,而模式串是给定的,所以确切的说,只和前一次递推结果中最大字母(最大字母指的是按字母排序的大小,如z&gt;y&gt;x&gt;...&gt;c&gt;b&gt;a)的位置有关.&lt;br /&gt;现在有点事没时间写了,明天接着写,不过规律已经给出了,就是根据前一次结果的最大字母的位置来计算.大家可以先自己想想.&lt;br /&gt;接着写.&lt;br /&gt;既然找到了问题的本质,那么就构造一个数据结构存储每次递推的最大字母的位置即可.本题可以用一个简单数组记录便可.如下所示,用一个整型数组num记录.(数组的具体大小视情况而定,在此不做细究,题目中说不会大于26).num[a] = b的含义是,在位置a上(第a位上)最大字母出现的次数是b次.&lt;br /&gt;const int maxNum = 30;&lt;br /&gt;int num[maxNum];&lt;br /&gt;用string moduleString;记录模式串.&lt;br /&gt; &lt;br /&gt;程序的思想是:&lt;br /&gt;1.      输入模式串的长度为n时,从模式串的第一个字母开始递推.&lt;br /&gt;2.      数组num的第一位即num[0]做边界处理,真正的记录从num[1]开始.&lt;br /&gt;3.      在递推时,如果当前字母是”A”,那么只关心”这次最大字母”在”前一次递推的结果中最大字母”右边的情况有几种.如果是”B”,那么只关心”这次最大字母”在”前一次递推的结果中最大字母”左边的情况有几种&lt;br /&gt;下面举个具体的例子来分析:以输出”ABAB”为例,每一行表示每次递推之后num数组的变化&lt;br /&gt;模式串/位置 第零位 第一位 第二位 第三位 第四位 第五位 &lt;br /&gt;A 0 0 1       &lt;br /&gt;AB 0 1 1 0     &lt;br /&gt;ABA 0 0 1 2 2   &lt;br /&gt;ABAB 0 5 5 4 2 0 &lt;br /&gt;&lt;br /&gt;1)        A: 此时最大字母为b,显然它出现在第2位(记住第零位永远是0,真正的记录从第一位开始)&lt;br /&gt;2)        AB:此时最大字母为c,它要求出现在b之前,分别是cab,acb.所以c在第一位,第二位上各出现一次.&lt;br /&gt;3)        ABA: 此时最大字母为d,它要求出现在c之后.显然d出现在第一位是不可能的,所以在第一位出现的次数是0.因为c在前一次结果的第一位出现过一次,所以d在那种情况下可以在第二位出现一次.下面来看d在第三位可能出现的次数,因为前一次结果中,在第三位之前c出现过2次,那么d可以在那两种情况下出现在第三位,所以d在第三位出现的次数为2.最后看d在第四位出现的次数,还是因为前一次结果中c在第四位之前出现的次数是2次,所以d在第四位出现的次数是2&lt;br /&gt;4)        ABAB:   此时最大字母是e,计算它出现的次数的方法和前面的一样,只是它要求是在前一次最大字母d的左边,只要反过来从右往左遍历就行了,在此不再累述.&lt;br /&gt;最终的程序为:&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;     const int maxNum = 30;&lt;br /&gt;     int num[maxNum];   //num[0] = 0; &lt;br /&gt;     string moduleString;&lt;br /&gt;     int length;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;     cout&lt;&lt;"Input Module String"&lt;&lt;endl;&lt;br /&gt;     cin&gt;&gt;moduleString;&lt;br /&gt; &lt;br /&gt;     length = moduleString.length();&lt;br /&gt;     if(moduleString[0] == 'A')&lt;br /&gt;     {&lt;br /&gt;         num[1] = 0;&lt;br /&gt;         num[2] = 1;&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;         num[1] = 1;&lt;br /&gt;         num[2] = 0;&lt;br /&gt;     }&lt;br /&gt;     num[0] = 0;&lt;br /&gt;     int preNum0 = 0;&lt;br /&gt;     int preNum1 = 0;&lt;br /&gt;     for(int i = 1; i &lt; length; i++)&lt;br /&gt;     {&lt;br /&gt;         if(moduleString[i] == 'A')&lt;br /&gt;         {&lt;br /&gt;              preNum0 = num[0];&lt;br /&gt;              preNum1 = num[1];&lt;br /&gt;              for(int j = 1; j &lt;= i+2; j++)&lt;br /&gt;              {&lt;br /&gt;                   num[j] = num[j-1] + preNum0;&lt;br /&gt;                   preNum0 = preNum1;&lt;br /&gt;                   preNum1 = num[j+1];&lt;br /&gt;              }&lt;br /&gt;         }&lt;br /&gt;         else&lt;br /&gt;         {&lt;br /&gt;              num[i+2] = 0;&lt;br /&gt;              for(int j = i+1; j &gt; 0; j--)&lt;br /&gt;              {&lt;br /&gt;                   num[j] = num[j+1] + num[j];&lt;br /&gt;              }&lt;br /&gt;              &lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;     int totalNum = 0;&lt;br /&gt;     for(int i = 0;i &lt; length + 2;i++)&lt;br /&gt;     {&lt;br /&gt;         totalNum += num[i];&lt;br /&gt;     }&lt;br /&gt;     cout&lt; &lt; totalNum &lt; &lt; endl;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;     return 0;&lt;br /&gt;}&lt;br /&gt;对程序的几点说明:&lt;br /&gt;1.    该程序缺少头部信息.(&lt;string&gt;,&lt;iostream&gt;)&lt;br /&gt;2.    该程序已调试通过,为可用版本&lt;br /&gt;3.    该程序的输入为一个形如”ABA..”的模式串,输出为符合要求的结果串的个数.&lt;br /&gt;4.    该程序的时间复杂度为n^2&lt;br /&gt;5.    该程序只为展示如何解决此类问题,输入输出可能与原题不符,相信读者可根据此程序作少许修改以通过Top coder的测试.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-6280624798297341140?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/6280624798297341140/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=6280624798297341140' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6280624798297341140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6280624798297341140'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2009/01/top-coder.html' title='Top coder'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-3110939725575168835</id><published>2008-12-03T06:13:00.001-08:00</published><updated>2008-12-03T06:13:51.102-08:00</updated><title type='text'>茨威格说，爱到极致无所求</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-3110939725575168835?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/3110939725575168835/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=3110939725575168835' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3110939725575168835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3110939725575168835'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/12/blog-post.html' title='茨威格说，爱到极致无所求'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-7173830371535549225</id><published>2008-09-18T03:27:00.000-07:00</published><updated>2008-09-18T03:29:29.611-07:00</updated><title type='text'>9.18</title><content type='html'>From each vertex B to each vertex C there is either a one-step path (a single edge) or a unique two-step path. But we'll analyze the problem by looking at three-step paths as well. Fix two vertices B and C. Suppose there are k different vertices H such that (H,C) is an edge. Call these vertices the "predecessors" of C. Suppose also that there are m different vertices G such that (B,G) is an edge; call these vertices the "followers" of B. How many paths, of length either two or three (but not one) are there from B to C? First answer: there are m such paths. Each two- or three-step path from B to C consists of an edge from B to some vertex G, followed by the unique one- or two-step path from that vertex G to the destination C. Since there are m edges leading out of B, and each can be completed to exactly one path of length 2 or 3 to C, there are m such paths. Second answer: k. Each two- or three-step path from B to C is a one- or two-step path from B to one of C's predecessors H, followed by a one-step path from that vertex to C. Each of the k predecessors of J accounts for exactly one such path. So we must have k=m. By the same reasoning, each vertex D has exactly k two- or three-step paths to C, and so has exactly k successors. Similarly we can see that each vertex has exactly k predecessors. (In graph terminology, each vertex has in-degree k and out-degree k.) Now consider one- or two-step paths starting at B. There are exactly k vertices H reachable by a one-step path. Since each of these vertices also has exactly k followers, there are exactly (k*k) vertices reachable from B via two-step paths. This accounts for all the vertices, so the total number of vertices is k+(k*k). We know there are thirty to forty vertices, so we must have k=5 and the number of vertices is thirty. It turns out (though this is harder to prove) that the vertices can be given consistent labels of the form Vij, where i and j are two different indices from the set {1,2,...,k+1}, and where an edge goes from Vij to Vkh if and only if j=k. Illustrating in a smaller case k=2, we would have 6=2+4 vertices V12, V13, V21, V23, V31, V32, and twelve edges (two coming out of each vertex): (V12,V21), (V12,V23), (V13,V31), (V13,V32), (V21,V12), (V21,V13), (V23,V31), (V23,V32), (V31,V12), (V31,V13), (V32,V21), (V32,V23).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-7173830371535549225?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/7173830371535549225/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=7173830371535549225' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/7173830371535549225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/7173830371535549225'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/09/918.html' title='9.18'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-2244915275660045891</id><published>2008-09-08T01:57:00.000-07:00</published><updated>2008-09-08T01:58:40.961-07:00</updated><title type='text'>9.9</title><content type='html'>Q:&lt;br /&gt;In every round robin tennis tournament, there is a player who, for any other player p, has either beaten p or beaten some player who has beaten p. &lt;br /&gt;Zh:&lt;br /&gt;n个人中每两个人之间都进行过一次比赛。假设比赛不可能出现平局。证明，一定能找出这样的一个人，对于其它任何一人p，他击败了p或者击败了某个打败了p的人。&lt;br /&gt;&lt;br /&gt;A:&lt;br /&gt;The problem has been characterized as a quickie: once you hit on the right idea, the solution takes just a few lines.&lt;br /&gt;&lt;br /&gt;There may be several players with the stated property: for any other player p, this one either beat p or beat a player who has beaten p. The nice idea that makes the problem a quickie is that the player who won most of the games has this property. Let P be such a player and GP a group of players beaten by P. Assume there is a player q not in GP who, in addition, has not lost to any p in GP. Since, it's a round robin tournament, that is a tournament in which every player meets any other player, q met with P and any player from GP. Moreover, since he has not lost to either P or any member of the GP group, he won all those meets implying that he won more meets than P. Contradiction with the selection of P. In other words, any q that is not in GP has been beaten by a member of the GP group.&lt;br /&gt;&lt;br /&gt;The problem admits a recasting in terms of Graph Theory. Start with a complete graph Kn, n &gt; 1. (A graph is complete if any two nodes are joined by an edge.) Convert Kn to a directed graph (digraph) by arbitrarily assigning to each edge a direction. The problem stipulates the existence of a node from which any other node is accessible by a directed path of the length at most 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-2244915275660045891?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/2244915275660045891/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=2244915275660045891' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/2244915275660045891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/2244915275660045891'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/09/99.html' title='9.9'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-6734706846598973868</id><published>2008-09-08T01:13:00.000-07:00</published><updated>2008-09-08T01:32:05.334-07:00</updated><title type='text'>9.8</title><content type='html'>Q:&lt;br /&gt;There are 2n + 1 people with the property that, for any n of them, there is some one of the 2n + 1, not among the n, acquainted with all n. Show that there is a person that is acquainted with every one present.&lt;br /&gt;A:&lt;br /&gt;The problem has been characterized as a quickie: once you hit on the right idea, the solution takes just a few lines.&lt;br /&gt;&lt;br /&gt;The problem has a natural representation as a graph: two nodes are connected by an edge iff the fellows they represent are acquainted. The nice idea that makes the problem a quickie is that, under the conditions of the problem, there is always a clique of size at least n + 1. A clique is a term for a subgraph that, as a graph, is complete.&lt;br /&gt;&lt;br /&gt;Let's first show that the existence of a clique C of size n + 1 leads to a solution of the problem. Let R be the remaining nodes. By the conditions of the problem, there exists a node outside R that is connected to every node in R. Since this node belongs to C (in which all the nodes are connected to each other), this node is connected to all other nodes.&lt;br /&gt;&lt;br /&gt;Now, let's form a clique of size n + 1. Pick any n nodes. There is a node that is connected to each of the selected ones. This one, along with any of the selected, form a clique of size 2. Arbitrarily add n - 2 nodes to these two. There is a node that is connected to each of the selected ones. Along with a 2-clique it forms a 3-clique. We may continue in this manner until we get an n-clique. For this, as for any collection of n nodes, there is a node connected to each of the selected ones. Together they form an (n + 1)-clique.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-6734706846598973868?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/6734706846598973868/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=6734706846598973868' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6734706846598973868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6734706846598973868'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/09/98.html' title='9.8'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-2737387089459844562</id><published>2008-06-24T06:24:00.000-07:00</published><updated>2008-06-24T06:25:21.529-07:00</updated><title type='text'>龙宽的生活</title><content type='html'>龙宽 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;18岁的我，不会设计未来 &lt;br /&gt;&lt;br /&gt;龙宽 &lt;br /&gt;&lt;br /&gt;　　我在飞机上吐了个天翻地覆。站在海关人员面前我的身体发飘，大脑累得不想再转。他要我把身上带着的一大沓美元拿出来给他看，又问我数目是多少，我说大概有五千。这么些钱够支持多久？他问我。 &lt;br /&gt;&lt;br /&gt;　　“我父母还会再寄钱来。”这是谎话。 &lt;br /&gt;&lt;br /&gt;　　他不信任地看了我一眼，盖上了九个月的签证。 &lt;br /&gt;&lt;br /&gt;　　这是1998年1月4日的晚上，第一眼看到伦敦的时候它就在下雨。 &lt;br /&gt;&lt;br /&gt;　　去英国对于我所有的朋友来说是一件突然的事，我在北京的生活刚刚进入最舒服的阶段，每天跟一群感情深厚的哥们儿生活在一起，和唱片公司准备签约做专辑。而我放弃这一切跑到英国的原因很简单，因为十八岁的我不可救药地爱上了一个英国人，所以在他回国以后决定去找他。 &lt;br /&gt;&lt;br /&gt;　　瑞斯克是让我不顾一切飞越万水千山来到英国的人，早已在伦敦有着稳定的生活，他说不愿意见我。马上打道回府的想法在我脑子里一闪而过，接下来的念头是，我要留下来。我要在伦敦呆下去。 &lt;br /&gt;&lt;br /&gt;　　一个人在十八岁的时候从不会设计未来，因此我压根儿就没想过到了英国以后的生活会怎样开始，没给自己设计一条退路。如果不是为了爱情住在这个国家，那么它吸引我的只有音乐，比北京更广阔的音乐空间。 &lt;br /&gt;&lt;br /&gt;　　第一个星期我出去买了一份专门登各种免费广告的报纸Loot，在上面给自己登了一条消息：中国女孩，歌手兼吉他手兼词曲创作人，有意组乐队者请打电话。接下来的一个月里，我接到了三十多个电话，但大多数人只是看到了广告上的“中国女孩”而感兴趣，我见到了各种各样不靠谱的乐手，他们不是根本不会弹琴，就是拨弄两下吉他以后就开始对我胡言乱语。 &lt;br /&gt;&lt;br /&gt;　　我借住在北京认识的帕特家里，他在伦敦大学上学，我每天白天在街上走来走去熟悉街道，心里想，这里的冬天真暖和。空气因为经常下雨而非常潮湿，温度跟北京的春天差不多。周围的人似乎都在过着井然有序的生活，白天人人都去上班了，路上行人稀少，只有牵着狗的老人和附近大学的学生不慌不忙地在街上走。头两天我走着走着就迷路了，向许多人问路才回到家，被问的人知道我英文不好，都微笑着慢慢讲。 &lt;br /&gt;&lt;br /&gt;　　那段时间内伦敦确实给了我非常良好的印象，超市里面的食物之多让我兴奋不已，超市外面有人在卖一种叫Biglssue的杂志，它是专为无家可归的人和失业者办的，售价一英镑，卖它的人每份可以得到45便士。租录像带的商店里有我想看而在中国找不到的全部电影，就是在公共汽车上和地铁里，也像是在看电影一样，有那么多酒鬼、疯子，打扮很酷的年轻人和穿西装的白领上班族并排坐在一起，这一切让我觉得伦敦是一个色彩丰富、充满机会的城市，对于前面未知的生活，我不再感到担心。 &lt;br /&gt;&lt;br /&gt;　　我住的地区叫King’Gross，是伦敦有名的红灯区，街上电话亭里贴满了妓女的照片，我把它们都摘了下来，贴在我练琴房间的墙上当做装饰品。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-2737387089459844562?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/2737387089459844562/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=2737387089459844562' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/2737387089459844562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/2737387089459844562'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/06/blog-post_24.html' title='龙宽的生活'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-6265620062009931409</id><published>2008-06-22T10:44:00.002-07:00</published><updated>2008-06-22T10:45:01.029-07:00</updated><title type='text'>乐鼠无牙</title><content type='html'>DISCOVERY上说人类天生就有种向下坠的欲望，我不敢去蹦极也没打算跳楼，只能在睡觉的时候，静静闭上眼睛等待开始下坠的感觉，心理学家认为这种坠落的感觉是人在由清醒状态进入睡眠状态的物理反映，是梦的前兆，Jael在电音中飘渺迷幻地哼唱着《Fall》,亦象是催眠一般带你入梦。一个人坐车乱逛的时候，路上一直听着这首歌，任旋律在脑袋里面流淌，车子在美丽得不真实的风景中飞速穿行，想着如果可以一直这样坐下去该有多好。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-6265620062009931409?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/6265620062009931409/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=6265620062009931409' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6265620062009931409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6265620062009931409'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/06/blog-post_3203.html' title='乐鼠无牙'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-4543864634785329955</id><published>2008-06-18T08:01:00.000-07:00</published><updated>2008-06-18T08:03:39.907-07:00</updated><title type='text'>坚持笔记</title><content type='html'>以后坚持写blog了吧&lt;br /&gt;这个我觉得起码代表&lt;br /&gt;1 一种坚持&lt;br /&gt;2 写下我每天做的事情&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-4543864634785329955?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/4543864634785329955/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=4543864634785329955' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4543864634785329955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4543864634785329955'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/06/blog-post.html' title='坚持笔记'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-5982558546925718113</id><published>2008-06-11T13:41:00.001-07:00</published><updated>2008-06-11T13:41:27.748-07:00</updated><title type='text'>laibao</title><content type='html'>心里面真不是滋味啊。小车载着，小腰搂着，小背靠着，小嘴笑着。靠，突然反应过&lt;br /&gt;来男的不是偶……&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-5982558546925718113?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/5982558546925718113/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=5982558546925718113' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/5982558546925718113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/5982558546925718113'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/06/laibao.html' title='laibao'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-3171556637122332932</id><published>2008-06-01T13:20:00.000-07:00</published><updated>2008-06-01T13:21:10.511-07:00</updated><title type='text'>Dimension reduction</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-3171556637122332932?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/3171556637122332932/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=3171556637122332932' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3171556637122332932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3171556637122332932'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/06/dimension-reduction.html' title='Dimension reduction'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-1130400373247129508</id><published>2008-05-21T02:47:00.001-07:00</published><updated>2008-05-21T02:48:42.595-07:00</updated><title type='text'>X-japan</title><content type='html'>From: http://cn.last.fm/music/X+JAPAN/+wiki&lt;br /&gt;&lt;br /&gt;JAPAN 传记&lt;br /&gt;&lt;br /&gt; yoshiki：&lt;br /&gt;　　队长兼鼓手兼钢琴兼老板，原名林佳树，1965年11月20日出生，老家千叶馆山市。现在的身份是Extasy Record的CEO，日本著名古典钢琴家，还有是2005年爱知县国际博览会亲善大使。&lt;br /&gt;toshi：&lt;br /&gt;　　主唱。原名出山利三，1965年10月出生，老家同上。&lt;br /&gt;hide：&lt;br /&gt;　　主音吉他手。原名松本秀人，1964年12月13日出生，原籍神奈川县横须贺市。&lt;br /&gt;pata：&lt;br /&gt;　　吉他手。原名石冢智昭。千叶县千叶市人。大叔的资料不多，不过他酷爱喝酒，有酒就什么事情都OK。而且是巨人队的超级FAN，可以想象他在Tokyo Dome——巨人的主场演出时的快乐。&lt;br /&gt;taiji：&lt;br /&gt;　　前贝司手。原名泽田泰司，千叶人。&lt;br /&gt;heath：&lt;br /&gt;　　后贝司手。原名森江博。兵库县尼崎市人&lt;br /&gt;&lt;br /&gt;X japan 是视觉系的鼻祖，造型和音乐深受KISS的影响。 &lt;br /&gt;&lt;br /&gt;早在1978年，TOSHI和YOSHIKI这一对好朋友已经组成了乐队NOISE,在学校的文化祭和LIVE HOUSE演出，在82年夏,当HEAVY METAL和HARD ROCK刚刚流入日本时,他们成立了日本的第一只HM/HD乐队,那就是X JAPAN的前身——X 。 &lt;br /&gt;85年2月份,他们终于发表了第一张自己制作的单曲(SINGLE) “I’LL KILL YOU”(DADA Records)（indie）. 87年2月TAIJI(BASS),PATA(GUITAR)和HIDE(GUITAR)加入，使得长期处于队员更迭状态的X终于确立Toshi, Taiji, Pata, hide &amp; Yoshiki的固定阵容 . 1988年4月14日X的首张唱片“Vanishing Vision”发售，在Indie唱片销售榜上居于前位。 &lt;br /&gt;&lt;br /&gt;1992年1月5、6、7日成为第一支连续三天在Tokyo Dome公演的乐队。1月31日，正当X如日冲天的时候,BASS手TAIJI离队，加入LOUDNESS,理由是音乐理念不同而退出。8月25日X转投华纳唱片公司，新的贝斯手Heath加入。同时，因为美国已有一支同名乐队，正式改名为X Japan。于是,X JAPAN的成员稳定下来为:主唱(Vocal)TOSHI,钢琴兼鼓手(Drums &amp; Piano)YOSHIKI,吉他手(Guitar)PATA,吉他手(Guitar)HIDE,贝司手(Bass)HEATH. &lt;br /&gt;&lt;br /&gt;正当X JAPAN达到了顶峰时,97年4月22日,主唱TOSHI以音乐取向不同的理由提出退出，9月22日正式离开了X JAPAN,17年历史的X(X JAPAN)就解散了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;X-Japan带给日本的,不只是音乐的财富,虽然这支超级乐队的才华横溢在日本似乎只有”安全地带”可以与之媲美.更重要的是,他们带出了一种X的精神,永不言败的精神,革命的,反叛的精神,.X前期的华丽服装和发型,曾一度被人是为是神经的,现在已成为了X的象征,作为视觉摇滚(VISUAL ROCK)的始祖,X-Japan对后代产生了深刻的影响,这不仅仅体现在行为,衣着上,更多的是体现在精神力量上. &lt;br /&gt;&lt;br /&gt;X-Japan的历史 &lt;br /&gt;&lt;br /&gt;成立 &lt;br /&gt;&lt;br /&gt;早在1978年，TOSHI和YOSHIKI这一对好朋友已经组成了乐队NOISE,在学校的文化祭和LIVE HOUSE演出，开始了他们曲折而富有神话色彩的音乐之旅。 在82年夏,当HEAVY METAL和HARD ROCK刚刚流入日本时,他们成立了日本的第一只HM/HD乐队,那就是X JAPAN的前身——X 。实际上X乐队全名是“Psychedelic Violence Crime of Visual Shock”，据说起这个名字是Toshi的主意，Yoshiki起初并不是非常喜欢。TOSHI 担任主唱（Vocal）,YOSHIKI担任鼓手（Drums）. &lt;br /&gt;&lt;br /&gt;中学毕业后，Yoshiki和Toshi离开了家乡到了东京，开始为他们的音乐理想而努力。 发展刚成立时的X,队员极不稳定,先后来了又去的有YOJI(Guitar),TOMO(Guitar),TOKUO(Bass).但只有TOSHI和YOSHIKI苦苦支撑着. 直到85年2月份,他们终于发表了第一张自己制作的单曲(SINGLE) “I’LL KILL YOU”(DADA Records)（indie）,预期的1000张全部卖完,给予了X极大的鼓舞。 X又在86年4月发表了第二张SINGLE “ORGRAMS”(Extasy Records)(indie). &lt;br /&gt;&lt;br /&gt;87年2月TAIJI(BASS),PATA(GUITAR)和HIDE(GUITAR)加入，使得长期处于队员更迭状态的X终于确立Toshi, Taiji, Pata, hide &amp; Yoshiki的固定阵容 . &lt;br /&gt;&lt;br /&gt;一开始，日本的主要唱片公司认为想这种奇怪的乐队是没有市场价值的，不值得签约。但这是难不倒Yoshiki的，他向母亲贷了一笔钱，组成了自己的唱片公司——Extasy Record。 1988年4月14日X的首张唱片“Vanishing Vision”发售，在Indie唱片销售榜上居于前位。 88年4月14日,X终于发表了第一张大碟(album )”VANISHING VISION”(Extasy Records)(indie).在一周内,初回限定版的10,000张全部卖完！8月1日与CBS/Sony Records正式签约。6年来在修车房里的奋斗,使X终于得到了唱片公司的承认。 &lt;br /&gt;&lt;br /&gt;成熟 &lt;br /&gt;&lt;br /&gt;89年在涉谷公堂作了一次Blue Blood TourLIVE,成为第一支在此作LIVE BAND SHOW的乐队,打破了日本的POP的天下! 89年4月21日,X发表了出道首张MAJOR大碟”BLUE BLOOD”,大碟震撼了日本的音乐界,使得METAL冲出了地下,第一周就登上日本唱片榜Oricon 第四位.其后又是LIVE（Rose &amp; Blood Tour）又是发表VIDEO（”爆发寸前GIG”）,使X成为了日本最红的乐队. &lt;br /&gt;&lt;br /&gt;9月1日和12月31日,X接连推出MAJOR单曲碟”红”,单曲碟”ENDLESS RAIN”在Oricon榜上均取得了令人瞩目的成绩. X获得当年年终日本有线大赏秀新人奖，全日本有线大赏最优秀新人奖，1989年Oricon新人Single销量最高。 90年3月获得第4回日本Gold Disk大赏“New Artist of the Year”。 &lt;br /&gt;&lt;br /&gt;4月22日,第三张单曲WEEK END产生,当周登上Oricon榜第五位. 9月1日,发行了video”CELEBRATION-VISUAL SHOCK Vol.2.5”. 当年底获得日本有线大赏有线音乐优秀赏。 1991年3月第5回日本Gold Disk “Music Video”大赏。 &lt;br /&gt;&lt;br /&gt;1991年7月1日发表了第二张MAJOR大碟JEALOUSY,勇夺Oricon榜的第一位.7月31日在仙台举行“JT Super Sound ’91”。8月23日初次于Tokyo Dome举行演唱会，观众超过5万名。10月17、18、19日在新宿Power Station举行“X于朋友们”、“安静的X”、“奇怪的X”演唱会。24日在横滨的Arena公演，Yoshiki在Drum Solo当中倒下，演唱会中断并延期。29日在武道馆举行“Extasy Summit’91”，Yoshiki复出。11月12、13日在横滨的Arena举行延期的演唱会。17日在涩谷的Egg Man举行Live House Gig。25日宣布准备向海外进军。 12月1日单曲碟”Say Anything”推出,12月8日在NHK Hall举行“X With Orchestra”，与交响乐团同台演出。20日在武道馆举行“Violence In Jealousy Tour Final”。12月31日，X第一次参加NHK红白歌赛,演出“Silent Jealousy”。 &lt;br /&gt;&lt;br /&gt;1992年1月5、6、7日成为第一支连续三天在Tokyo Dome公演的乐队。1月31日，正当X如日冲天的时候,BASS手TAIJI离队，加入LOUDNESS,理由是音乐理念不同而退出。8月25日转投华纳唱片公司，新的贝斯手Heath加入，与MMG（即East West Japan）签约。同时，因为美国已有一支同名乐队，正式改名为X-Japan。10月29日“Extasy Summit 1992”在大阪城Hall举行，31日在日本武道馆举行。12月31日在第43回红白歌战中演出”红”(Kurenai)，Yoshiki为红白主题曲作词曲，并亲自以管风琴伴奏。 同年,BASS手HEATH加入. &lt;br /&gt;&lt;br /&gt;于是,X JAPAN的成员稳定下来为:主唱(Vocal)TOSHI,钢琴兼鼓手(Drums &amp; piano)YOSHIKI,吉他手(Guitar)PATA,吉他手(Guitar)HIDE,贝司手(Bass)HEATH… &lt;br /&gt;&lt;br /&gt;93年8月25日,X-Japan正式发表MINI大碟”ART OF LIFE”, 这首长达30分钟的巨作一举登上Oricon榜首席.11月21日，专辑“X Singles”发售。 当年在NHK红白演唱会上演唱”TEARS” . 94年11月30、31日“X-Japan Tokyo Dome 2 Day”(青的夜，白的夜）在Tokyo Dome举行。年底在NHK红白演唱会上演唱”Rasty Nail” 。 &lt;br /&gt;&lt;br /&gt;95 年1月1日现场版“1992.1.7 Tokyo Dome Live”发售。11月29日“Dahlia Tour 1995-1996”展开。单曲”Longing~迹切Melody~” ,”LONGING ~ 切望の夜”相继产生。 96年3月19日由CLAMP创作的动画巨片”X”公映,其主题曲是X-Japan的”Forever Love”,它成为X-Japan 最杰出的代表作.7月8日”Forever Love”作为X的第十二张单曲正式发行.11月4日专辑“Dahlia”发售，Oricon第一位。11月1日“B.O.X CD Best of X”发售。11月30、31日“Dahlia Tour Final”在Tokyo Dome举行。 三张单曲”DAHLIA”,”Crucify My Love”“SCARS”同年产生.本年是X-Japan最多产的一年,也是最辉煌的一年。 &lt;br /&gt;&lt;br /&gt;解散 &lt;br /&gt;&lt;br /&gt;正当X-Japan达到了顶峰时, 97年4月22日,主唱TOSHI以音乐取向不同的理由提出退出， 9月22日正式离开了X-Japan,离开20年的朋友YOSHIKI,离开了X的所有歌迷,他象洗了脑一样地,否认了过去,否认了自己否认了和他一起度过艰苦岁月的友人,以及X-Japan.让所有歌迷伤心欲绝.这样,17年历史的X(X-Japan)就解散了. 10月15日“Live Live Live Tokyo Dome 1993-1996”发售。11月15日“Live Live Live Extra”发售，主要收录Solo。12月19日“Ballad Collection”发售。12月25日“Singles Atlantic Years”发售。12月31日“The last Live”在Tokyo Dome举行，同天在红白歌战演奏“Forever Love”。X的历史画上了句号。 &lt;br /&gt;&lt;br /&gt;希望破灭 &lt;br /&gt;&lt;br /&gt;98年5月2日8:52AM,原名松本秀人的HIDE在家中上吊自尽,终年32岁.X-Japan传说中的2000年重组计划的最后希望也因此破灭.他的死至今为止都是一个谜.对于一个感情、事业皆得意的人来说，自杀真是不可思议，难道是忍受不住X-Japan解散所带来的悲伤？由于追随hide而自杀的事件在数日内不断发生，在5月7日在本愿寺举行的葬礼中，云集了从全国起来的5万名乐迷，送葬的队伍超过两公里长、有197人在这个当年最炎热的日子里贫血昏倒被送往医院，东京消防厅表示“除了发生意外事故之外，第一次有这么多人昏倒”，非常惊讶hide庞大的影响力。 &lt;br /&gt;&lt;br /&gt;结语 &lt;br /&gt;&lt;br /&gt;X-Japan带给日本的,不只是音乐的财富,虽然这支超级乐队的才华横溢在日本似乎只有”安全地带”可以与之媲美.更重要的是,他们带出了一种X的精神,永不言败的精神,革命的,反叛的精神,.X前期的华丽服装和发型,曾一度被人是为是神经的,现在已成为了X的象征,作为视觉摇滚(VISUAL ROCK)的始祖,X-Japan对后代产生了深刻的影响,这不仅仅体现在行为,衣着上,更多的是体现在精神力量上. &lt;br /&gt;&lt;br /&gt;现在 &lt;br /&gt;&lt;br /&gt;奋斗中的PATA &amp; HEATH、自由的HIDE、诗旅的TOSHI、Violet U.K.的YOSHIKI、「FILM GIG」……舞台……&lt;br /&gt;&lt;br /&gt;2007的X-JAPAN&lt;br /&gt;日传奇摇滚团「X JAPAN」复出 大手笔拍MV&lt;br /&gt;睽违10年，「X JAPAN」真的要重新出发了！堪称日本音乐史上最具传奇性的摇滚乐团「X JAPAN」，17日在东京台场的「水世界」屋顶上进行音乐录像带的拍摄，同时在大楼外围的大屏幕做实况转播，让许多X JAPAN迷终于又见到神迹。&lt;br /&gt;X JAPAN对于「复出」这件事情非常谨慎，团长YOSHIKI觉得讲再多都没实际行动有用。将音乐录像带的拍摄过程公开引发乐迷震撼，更出动直升机进行空拍作业，将四人的画面用多种角度做最完整的收录。&lt;br /&gt;这首睽违10年的新曲「I˙V」，是由YOSHIKI作词作曲，相关人士表示还会取样hide的吉他音源，将X JAPAN五人再度合体，并搭配即将在日本上映的电影「夺魂锯4」主题曲，而X JAPAN接下来也可能会有演唱会之类的活动计划，要把X JAPAN的音乐再度发扬光大！&lt;br /&gt;X JAPAN复出 hide「音」魂不散&lt;br /&gt;解散10年，日本传奇视觉性摇滚团「X JAPAN」终于复出，17日团员在东京台场的「水世界」屋顶重聚，拍摄新单曲音乐录像带，并在大楼四周电视墙实况转播，让X JAPAN迷再次感受偶像魅力。&lt;br /&gt;「X JAPAN」复出单曲〈I˙V〉是电影《夺魂锯》主题曲，团长Yoshiki作词作曲，并取样已逝吉他手hide生前未发表的吉他音源，将5人再度合体。&lt;br /&gt;接下来，团员还计画办演唱会，但吉他手之缺不再补人，改邀客座乐手一起演出。&lt;br /&gt;「X JAPAN」对复出一事很谨慎，Yoshiki在hide死后为他写的〈Without you〉，过去专辑中只有演奏版，如今该团复合，主唱Toshi也着手配唱人声版。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;X-JAPAN活动年表 &lt;br /&gt;&lt;br /&gt;1982年 夏 以YOSHIKI，TOSHI为中心组队，并以 “X”命名，开始进行地下音乐活动 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1987年 2月 经过多次成员变动，阵容基本确立YOSHIKI(drum&amp;piano) TOSHI (vocal) HIDE (guitar) PATA(guitar) TAIJI(bass) &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1988年 4月 乐队第一张专辑「VANISHING VISION」由自组的唱片公司发售。并且在地下音乐的排行榜上长期居于销售量排行榜前位，创地下乐团最畅销的记录 。 &lt;br /&gt;&lt;br /&gt;8月 乐队与CBS，SONY签约 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1989年 4月21日 发表第一张专辑《BLUE BLOOD》（乐队进入主流音乐） &lt;br /&gt;&lt;br /&gt;6月1日 乐队发售录音带《爆发寸前GIG》（为了作曲乐队到美国纽约，洛杉矶） &lt;br /&gt;&lt;br /&gt;9月1日 第一张单曲《红》售，随后《ROSE&amp;BLOOD TUOR》巡回演唱会开始 &lt;br /&gt;&lt;br /&gt;11月23日 YOSHIKI在涉谷公会堂昏倒，之后的演唱会行程全部延期 &lt;br /&gt;&lt;br /&gt;12月1日 第二张单曲《ENDLESS RAIN》发售。随后获得日本有线大赏最优秀新人奖。 ORICON排行榜1989年度新人最佳唱片销售量第一名 &lt;br /&gt;&lt;br /&gt;12月31日 录影带「刺激~VISUAL SHOCK VOL.2」发售 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1990年 2月 4日 YOSHIKI复活LIVE于日本武道馆《ROSE&amp;BLOOD TOUR》再开 &lt;br /&gt;&lt;br /&gt;3月 日本金唱片大赏《NEW ARTIST OF THE YEAR》得奖 &lt;br /&gt;&lt;br /&gt;4月21日 第三张单曲《WEEK END》发售 5月7， &lt;br /&gt;&lt;br /&gt;9日《ROSE&amp;BLOOD TUOR FINAL》日本武道馆（两天） &lt;br /&gt;&lt;br /&gt;5月17日 《ROSE&amp;BLOOD TUOR FINAL》在大阪城HALL举行 &lt;br /&gt;&lt;br /&gt;6月 为准备第二张专辑，活动暂停 9月1日 《VISUAL SHOCK 2.5 CELEBRATION》发售 &lt;br /&gt;&lt;br /&gt;11月 乐队去美国做第二张专辑的录音工作 &lt;br /&gt;&lt;br /&gt;12月 《X FILM GIG~涂满血与蔷薇」东京湾NK HALL开始，在两天中有超过一万五千名的观众。并得日本有线大赏音乐优秀奖 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1991年 3月 音乐录影带《VISUAL SHOCK 2.5 》在日本金唱片大赏得奖 &lt;br /&gt;&lt;br /&gt;4月 《X FILM GIG~涂满血于蔷薇 FINAL》在川崎CLUB CHITTA &lt;br /&gt;&lt;br /&gt;6月5日 乐队结束将近七个月的录音工作之后，团员回日本 &lt;br /&gt;&lt;br /&gt;7月1日 新专辑《JEALOUSY》发售。在ORICON排行榜第一周就拿下销售量第一位 &lt;br /&gt;&lt;br /&gt;7月31日 举行全国第一场演唱会。参加仙台ONIKOUBA高原EVENT「JT SUPER SOUND ‘91」&lt;br /&gt;&lt;br /&gt;8月6日 在新潟产业中心开始「VIOLENCE IN JEALOUSY TOUR~只活在梦中」巡回演唱会 &lt;br /&gt;&lt;br /&gt;8月23日 第一次东京巨蛋公演。超过五万人的观众站著，把东京巨蛋变成LIVE HOUSE般感动的演唱会 &lt;br /&gt;&lt;br /&gt;9月11日 第四张单曲《SLIENT JEALOUSY》发售 &lt;br /&gt;&lt;br /&gt;9月30日 录影带「刺激 VISUAL SHOCK Vol. 3 ~ 只活在梦中」发售 &lt;br /&gt;&lt;br /&gt;10月17日 在新宿POWER STATION举行演唱会「X与朋友们」 &lt;br /&gt;&lt;br /&gt;10月18日 在新宿POWER STATION举行演唱会「安静的X」 &lt;br /&gt;&lt;br /&gt;10月19日 在新宿POWER STATION举行演唱会「奇怪的X」 &lt;br /&gt;&lt;br /&gt;10月24日 巡回演唱最後一个地点：横滨体育场，YOSHIKI在鼓独奏的中途倒下、演唱会中断。 &lt;br /&gt;&lt;br /&gt;10月24．25日的演唱会延期至11月12．13日 &lt;br /&gt;&lt;br /&gt;10月25日 第五张单曲《STANDING SEX/JOKER》发售 &lt;br /&gt;&lt;br /&gt;10月29日 在武道馆举行的「EXTASY SUMMIT `91」中，YOSHIKI回来 &lt;br /&gt;&lt;br /&gt;10月31日 YOSHIKI与小室哲哉结成的乐团「V2」举行记者会 &lt;br /&gt;&lt;br /&gt;11月 4日 原定在原宿举行的「Jealousy影像再现」因聚集了太多（五千名以上）的歌迷而中止活动 &lt;br /&gt;&lt;br /&gt;11月12日 横滨体育场延期公演 &lt;br /&gt;&lt;br /&gt;11月13日 横滨体育场延期公演 &lt;br /&gt;&lt;br /&gt;11月17日 在涉谷Egg Man举行没有预告的LIVE HOUSE GIG &lt;br /&gt;&lt;br /&gt;11月25日 在记者会发表「东京巨蛋3 DAY ~ 朝向毁灭」演唱会与向海外进军的准备计画 &lt;br /&gt;&lt;br /&gt;12月 1日 第六张单曲《SAY ANYTHING》发售 12月5日 YOSHIKI:「V2」在NK HALL举行「莫扎特逝世两百周年纪念特别演唱会」 &lt;br /&gt;&lt;br /&gt;12月8日 在NHK HALL举行与整个交响乐团在舞台上共同演出的「X with Orchestra」演唱会。 &lt;br /&gt;&lt;br /&gt;12月12日 「Yoshiki Selection ~ Yoshiki所喜爱的古典音乐」发售。是Yoshiki 所选曲集成的古典乐专辑。在西洋音乐排行榜上超越麦可杰克森、 U2而得到第一名。 &lt;br /&gt;&lt;br /&gt;12月20日 在日本武道馆以FILM GIG的形式从八月起在全国九个演出地点－把「Violence in Jealousy FINAL」十五场全部票卖光的演出在大萤幕上播放。但是在第二次的时候，银幕落下，後面是真的乐团在演奏，因为「是X的话不知道会发生什么？」 &lt;br /&gt;&lt;br /&gt;12月21日 录影带「SAY ANYTHING~VISUAL SHOCK VOL 3.5」发售 &lt;br /&gt;&lt;br /&gt;12月31日 第42回红白歌合战出场演奏「Silent Jealousy」。结束後在目黑，鹿鸣馆照往例举行倒数计时 &lt;br /&gt;&lt;br /&gt;1992年 1月5-7日 《东京巨蛋3DAY～朝向毁灭》日本艺人史上第一次在东京巨蛋连续公演三天。 &lt;br /&gt;&lt;br /&gt;1月18日 「V2」单曲《背德之瞳/Virginity》发售 &lt;br /&gt;&lt;br /&gt;1月31日 Taiji宣布退团（另组DIRTY TRASH ROAD） &lt;br /&gt;&lt;br /&gt;2月21日 录影带「写做无敌读成EXTASY~EXTASY SUMMIT ‘91 AT NIPPON BUDOKAN」发售 3月 第六回金唱片大奖古典部门专辑得奖 &lt;br /&gt;&lt;br /&gt;3月21日 「V2」的录影带《VIRGINITY》发售 &lt;br /&gt;&lt;br /&gt;8月 乐队名称改为 10月 演唱会[EXTASY SUMMIT 1992] &lt;br /&gt;&lt;br /&gt;11月 「Visual Shock Vol. 4 朝向毁灭」演唱会录影带与影碟发售 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1993年 5月 发行录像带[EXTASY~EXTASY SUMMIT1992] &lt;br /&gt;&lt;br /&gt;7月 演唱会[X FILM GIGS 1993~VISUAL SHOCK] &lt;br /&gt;&lt;br /&gt;8月 发行[ART OF LIFE]迷你专辑 &lt;br /&gt;&lt;br /&gt;11月10日 第七张单曲《TEARS》发售 &lt;br /&gt;&lt;br /&gt;11月 发行专辑《X SINGLES》 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1994年 7月 10日 第八张单曲《RUSTY NAIL》发售 &lt;br /&gt;&lt;br /&gt;12月 演唱会[X JAPAN 东京2day] &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1995年 1月 发行专辑[1992.1.7TOKYO DOME LIVE] &lt;br /&gt;&lt;br /&gt;7月1日 发行第九张单曲《LONGING～MELODY》 &lt;br /&gt;&lt;br /&gt;9月 1日 发行第十张单曲《LONGING～切望的夜》 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1996年 2月 26日 第十一张单曲《DAHLIA》发行 &lt;br /&gt;&lt;br /&gt;7月 8日 《FOREVER LOVE》发售 &lt;br /&gt;&lt;br /&gt;8月 26日 第十三张单曲《CRUCIFY MY LOV发售 &lt;br /&gt;&lt;br /&gt;9月2日 hide的第二张个人专辑「PSYENCE」发售 &lt;br /&gt;&lt;br /&gt;11月4日 睽违五年的专辑《DAHLIA》发售 &lt;br /&gt;&lt;br /&gt;11月11日 《scars》单曲发售 &lt;br /&gt;&lt;br /&gt;12月 发售专辑《X B.O.X》 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1997年 1月 发售录像带《DAHLIA THE VIDEO SHOCK#5 PART1》 &lt;br /&gt;&lt;br /&gt;3月 发售录像带《DAHLIA THE VIDEO SHOCK#5 PART2》 &lt;br /&gt;&lt;br /&gt;9月22日 乐队由于TOSHI 和YOSHIKI的音乐理念不同而突然解散 &lt;br /&gt;&lt;br /&gt;10月 发行专辑《LIVE LIVE LIVE TOKYO DOOM.1993~1996》 &lt;br /&gt;&lt;br /&gt;11月 发售专辑《LIVE LIVE LIVE EXTRA》 &lt;br /&gt;&lt;br /&gt;12月 发行专辑《BAKKAD COLLECTION》 &lt;br /&gt;&lt;br /&gt;12月31日 《THE LAST LIVE》演唱会 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1998年 1月 发行专辑《X JAPAN LIVE IN HOKKAIDO 1995.12.4 BOOT LEG》 &lt;br /&gt;&lt;br /&gt;3月 发行专辑《ART OF LIFE》 &lt;br /&gt;&lt;br /&gt;3月 发行专辑《THE LAST SONG》 &lt;br /&gt;&lt;br /&gt;5月2日 hide在家中上吊自杀 &lt;br /&gt;&lt;br /&gt;———————————————————————————————————————— &lt;br /&gt;&lt;br /&gt;1999年 2月 发售专辑《X JAPAN PERFECT BEST》……………… &lt;br /&gt;&lt;br /&gt;传说中的录音——X之未发表作品集“Rose and Blood”公开！！！ &lt;br /&gt;&lt;br /&gt;2001年5月2日发行的这张专辑中共收录了8首作品，全是X于地下时期灌录的未发表曲目，其中不乏熟悉的旋律，很多都是MAJOR后X 作品的雏形。Shadows的就是后来的JOKER，Black Devil就是后来的DESPERATE ANGER，Not True？则是X的名曲MISCAST的前身。 &lt;br /&gt;&lt;br /&gt;令人惊叹的是最后一曲End of the World居然是Art of life的完整演奏曲！！！长达21：33。看来Art of life的曲子在indies时期便谱好的，不过里面用的是键盘，而不是钢琴。 &lt;br /&gt;&lt;br /&gt;这张专辑中的作品都出自他们的DemoTape，欧美风格很浓重，很多都是未完成作品，歌词并没有写完，只听见TOSHI在那儿“呐呐呐……”的唱，第2是其中最带劲的一首，可能是Taiji作的，我喜欢极了！演奏曲Rose and Blood也是绝对的Perfect！ &lt;br /&gt;&lt;br /&gt;X把这些老掉牙的东西翻出来出，实在是让FANS们大饱耳福！Yoshiki曾经说过，还有AMETHYST的演唱版本、DAHLIA的混音版本等很多未完成的作品，现在还都躺在阴暗的资料室里呢，也许终有那么一天，它们都会重见天日的！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-1130400373247129508?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/1130400373247129508/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=1130400373247129508' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/1130400373247129508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/1130400373247129508'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/05/x-japan.html' title='X-japan'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-8563477041936944743</id><published>2008-05-20T10:31:00.000-07:00</published><updated>2008-05-20T10:46:23.999-07:00</updated><title type='text'>ACM pku 1067</title><content type='html'>From&lt;br /&gt;http://hi.baidu.com/wuxyy/blog/item/4614af4b59f3a5f083025c5c.html&lt;br /&gt;&lt;br /&gt;Stone Game（取石子游戏的三类博弈）2007-02-19 21:25（一）巴什博弈（Bash Game）：只有一堆n个物品，两个人轮流从这堆物品中取物，规定每次至少取一个，最多取m个。最后取光者得胜。&lt;br /&gt;&lt;br /&gt;很容易想到当n%(m+1)&lt;&gt;0时，先取必胜，第一次先拿走n%(m+1)，以后每个回合到保持两人拿走的物品总和为m+1即可。&lt;br /&gt;&lt;br /&gt;这个游戏还可以有一种变相的玩法：两个人轮流报数，每次至少报一个，最多报十个，谁能报到100者胜。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;（二）威佐夫博弈（Wythoff Game）：有两堆各若干个物品，两个人轮流从某一堆或同时从两堆中取同样多的物品，规定每次至少取一个，多者不限，最后取光者得胜。&lt;br /&gt;&lt;br /&gt;如果甲面对（0，0），那么甲已经输了，这种局势我们称为奇异局势。前几个奇异局势是：（0，0）、（1，2）、（3，5）、（4，7）、（6，10）.可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk=ak+k.&lt;br /&gt;&lt;br /&gt;    那么任给一个局势（a，b），怎样判断它是不是奇异局势呢？我们有如下公式：&lt;br /&gt;&lt;br /&gt;    ak =[k（1+√5）/2]，bk= ak + k  （k=0，1，2，...,n 方括号表示取整函数)&lt;br /&gt;&lt;br /&gt;奇妙的是其中出现了黄金分割数（1+√5）/2 = 1。618...,因此,由ak，bk组成的矩形近似为黄金矩形，由于2/（1+√5）=（√5-1）/2，可以先求出j=[a（√5-1）/2]，若a=[j（1+√5）/2]，那么a = aj，bj = aj + j，若不等于，那么a = aj+1，bj+1 = aj+1+ j + 1，若都不是，那么就不是奇异局势。然后再按照上述法则进行，一定会遇到奇异局势。&lt;br /&gt;&lt;br /&gt;POJ1067 取石子游戏&lt;br /&gt;&lt;br /&gt;#include&lt;iostream&gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;       int k,n,m;&lt;br /&gt;&lt;br /&gt;       double r=0.6180339887,R=1/r;&lt;br /&gt;&lt;br /&gt;       while (scanf("%d%d",&amp;n,&amp;m)+1)&lt;br /&gt;&lt;br /&gt;       {&lt;br /&gt;&lt;br /&gt;              if (n&gt;m)&lt;br /&gt;&lt;br /&gt;              {&lt;br /&gt;&lt;br /&gt;                     k=n;&lt;br /&gt;&lt;br /&gt;                     n=m;&lt;br /&gt;&lt;br /&gt;                     m=k;&lt;br /&gt;&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;              k=n*r;&lt;br /&gt;&lt;br /&gt;              if (n!=(int)(k*R))&lt;br /&gt;&lt;br /&gt;                     ++k;&lt;br /&gt;&lt;br /&gt;              printf("%d\n",m!=(int)(k*R)+k);&lt;br /&gt;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return 0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;（三）尼姆博弈（Nimm Game）：有三堆各若干个物品，两个人轮流从某一堆取任意多的物品，规定每次至少取一个，多者不限，最后取光者得胜。&lt;br /&gt;&lt;br /&gt;对于任何奇异局势(a,b,c)，都有a^b^c=0.&lt;br /&gt;&lt;br /&gt;非奇异局势(a,b,c)(a &lt; b &lt; c)转换为奇异局势，只需将c变为a^b，即从c中减去 c-(a^b)即可。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    这种情况最有意思，它与二进制有密切关系，我们用（a，b，c）表示某种局势，首&lt;br /&gt;先（0，0，0）显然是奇异局势，无论谁面对奇异局势，都必然失败。第二种奇异局势是&lt;br /&gt;（0，n，n），只要与对手拿走一样多的物品，最后都将导致（0，0，0）。仔细分析一&lt;br /&gt;下，（1，2，3）也是奇异局势，无论对手如何拿，接下来都可以变为（0，n，n）的情&lt;br /&gt;形。&lt;br /&gt;&lt;br /&gt;    计算机算法里面有一种叫做按位模2加，也叫做异或的运算，我们用符号（+）表示&lt;br /&gt;这种运算。这种运算和一般加法不同的一点是1+1=0。先看（1，2，3）的按位模2加的结&lt;br /&gt;果：&lt;br /&gt;&lt;br /&gt;1 =二进制01&lt;br /&gt;2 =二进制10&lt;br /&gt;3 =二进制11 （+）&lt;br /&gt;———————&lt;br /&gt;0 =二进制00 （注意不进位）&lt;br /&gt;&lt;br /&gt;    对于奇异局势（0，n，n）也一样，结果也是0。&lt;br /&gt;&lt;br /&gt;    任何奇异局势（a，b，c）都有a（+）b（+）c =0。&lt;br /&gt;&lt;br /&gt;如果我们面对的是一个非奇异局势（a，b，c），要如何变为奇异局势呢？假设 a &lt; b&lt;br /&gt;&lt; c,我们只要将 c 变为 a（+）b,即可,因为有如下的运算结果: a（+）b（+）(a（+）&lt;br /&gt;b)=(a（+）a)（+）(b（+）b)=0（+）0=0。要将c 变为a（+）b，只要从 c中减去 c-（&lt;br /&gt;a（+）b）即可。&lt;br /&gt;&lt;br /&gt;    例1。（14，21，39），14（+）21=27，39-27=12，所以从39中拿走12个物体即可达&lt;br /&gt;到奇异局势（14，21，27）。&lt;br /&gt;&lt;br /&gt;    例2。（55，81，121），55（+）81=102，121-102=19，所以从121中拿走19个物品&lt;br /&gt;就形成了奇异局势（55，81，102）。&lt;br /&gt;&lt;br /&gt;    例3。（29，45，58），29（+）45=48，58-48=10，从58中拿走10个，变为（29，4&lt;br /&gt;5，48）。&lt;br /&gt;&lt;br /&gt;    例4。我们来实际进行一盘比赛看看：&lt;br /&gt;         甲:(7,8,9)-&gt;(1,8,9)奇异局势&lt;br /&gt;         乙:(1,8,9)-&gt;(1,8,4)&lt;br /&gt;         甲:(1,8,4)-&gt;(1,5,4)奇异局势&lt;br /&gt;         乙:(1,5,4)-&gt;(1,4,4)&lt;br /&gt;         甲:(1,4,4)-&gt;(0,4,4)奇异局势&lt;br /&gt;         乙:(0,4,4)-&gt;(0,4,2)&lt;br /&gt;         甲:(0.4,2)-&gt;(0,2,2)奇异局势&lt;br /&gt;         乙:(0,2,2)-&gt;(0,2,1)&lt;br /&gt;         甲:(0,2,1)-&gt;(0,1,1)奇异局势&lt;br /&gt;         乙:(0,1,1)-&gt;(0,1,0)&lt;br /&gt;         甲:(0,1,0)-&gt;(0,0,0)奇异局势&lt;br /&gt;         甲胜。&lt;br /&gt;&lt;br /&gt;POJ2234 Matches Game&lt;br /&gt;&lt;br /&gt;#include&lt;iostream&gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;       int i,k,n;&lt;br /&gt;&lt;br /&gt;       while (scanf("%d",&amp;n)+1)&lt;br /&gt;&lt;br /&gt;       {&lt;br /&gt;&lt;br /&gt;              for (k=0;n--;)&lt;br /&gt;&lt;br /&gt;              {&lt;br /&gt;&lt;br /&gt;                     scanf("%d",&amp;i);&lt;br /&gt;&lt;br /&gt;                     k^=i;&lt;br /&gt;&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;              if (k)&lt;br /&gt;&lt;br /&gt;                     printf("Yes\n");&lt;br /&gt;&lt;br /&gt;              else&lt;br /&gt;&lt;br /&gt;                     printf("No\n");&lt;br /&gt;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return 0;&lt;br /&gt;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-8563477041936944743?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/8563477041936944743/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=8563477041936944743' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/8563477041936944743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/8563477041936944743'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/05/acm-pku-1067.html' title='ACM pku 1067'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-8680299063429956278</id><published>2008-02-12T04:49:00.000-08:00</published><updated>2008-02-12T04:51:31.573-08:00</updated><title type='text'>最近在看《我们无处安放的青春》</title><content type='html'>这本书很多地方写得还真是准确：&lt;br /&gt;有这么一种说法，如果跟第一个男朋友旷日持久地精神恋爱，跟第二个男朋友就会短兵相接很快步入实质问题&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-8680299063429956278?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/8680299063429956278/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=8680299063429956278' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/8680299063429956278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/8680299063429956278'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2008/02/blog-post.html' title='最近在看《我们无处安放的青春》'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-6638538823757384330</id><published>2007-12-28T06:21:00.000-08:00</published><updated>2007-12-28T10:27:44.863-08:00</updated><title type='text'>微观经济学</title><content type='html'>微观经济学对付：&lt;br /&gt;实证问题和规范问题&lt;br /&gt;套利空间&lt;br /&gt;完全竞争性市场&lt;br /&gt;非竞争性市场&lt;br /&gt;shichang&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-6638538823757384330?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/6638538823757384330/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=6638538823757384330' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6638538823757384330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/6638538823757384330'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2007/12/blog-post_28.html' title='微观经济学'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-4235327546599882716</id><published>2007-10-29T05:52:00.000-07:00</published><updated>2008-12-11T01:54:40.489-08:00</updated><title type='text'>Improving Web Search Ranking by Incorporating User Behavior Information</title><content type='html'>We consider two complementary approaches to ranking with implicit feedback: (1) treating implicit feedback as independent evidence for ranking results, and (2) integrating implicit feedback features directly into the ranking algorithm. We describe the two general ranking approaches next. &lt;br /&gt;&lt;br /&gt;(1)Implicit Feedback as Independent Evidence&lt;br /&gt;The general approach is to re-rank the results obtained by a web search engine according to observed clickthrough and other user interactions for the query in previous search sessions. Each result is assigned a score according to expected relevance/user satisfaction based on previous interactions, resulting in some preference ordering based on user interactions alone.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We experimented with a variety of merging functions on the&lt;br /&gt;development set of queries (and using a set of interactions from a&lt;br /&gt;different time period from final evaluation sets). We found that a&lt;br /&gt;simple rank merging heuristic combination works well, and is&lt;br /&gt;robust to variations in score values from original rankers. For a&lt;br /&gt;given query q, the implicit score ISd is computed for each result d&lt;br /&gt;from available user interaction features, resulting in the implicitrank Id for each result. We compute a merged score SM(d) for d by&lt;br /&gt;combining the ranks obtained from implicit feedback, Id with the&lt;br /&gt;original rank of d, Od:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_13CsTDFxL-0/RyXc1l2sVBI/AAAAAAAAAHw/j-VzS4k1Vfg/s1600-h/New+Bitmap+Image.bmp"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_13CsTDFxL-0/RyXc1l2sVBI/AAAAAAAAAHw/j-VzS4k1Vfg/s400/New+Bitmap+Image.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5126746564083864594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;where the weight wI is a heuristically tuned scaling factor&lt;br /&gt;representing the relative “importance” of the implicit feedback. The&lt;br /&gt;query results are ordered in by decreasing values of SM to produce&lt;br /&gt;the final ranking. One special case of this model arises when setting&lt;br /&gt;wI to a very large value, effectively forcing clicked results to be&lt;br /&gt;ranked higher than un-clicked results – an intuitive and effective&lt;br /&gt;heuristic that we will use as a baseline. Applying more&lt;br /&gt;sophisticated classifier and ranker combination algorithms may&lt;br /&gt;result in additional improvements, and is a promising direction for&lt;br /&gt;future work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-4235327546599882716?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/4235327546599882716/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=4235327546599882716' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4235327546599882716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4235327546599882716'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2007/10/improving-web-search-ranking-by.html' title='Improving Web Search Ranking by Incorporating User Behavior Information'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_13CsTDFxL-0/RyXc1l2sVBI/AAAAAAAAAHw/j-VzS4k1Vfg/s72-c/New+Bitmap+Image.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-945820472964236719</id><published>2007-10-22T07:40:00.000-07:00</published><updated>2007-10-22T07:44:08.359-07:00</updated><title type='text'>好久没有更新了</title><content type='html'>埃....这个日子过的~~~&lt;br /&gt;晕乎乎的 尽管不用自己做饭了~~~谢谢congcong~~~&lt;br /&gt;但是还是感觉不太舒服 不知道什么原因&lt;br /&gt;最近在看QA 和 interactive QA的东西....&lt;br /&gt;刚装了ubuntu最新版本 还在弄 兼容性始终是个问题&lt;br /&gt;1.openoffice更新之后有个问题&lt;br /&gt;只需更改一行配置文件就搞定了~~~&lt;br /&gt;2.flash player 9.0 不支持X64....&lt;br /&gt;慢慢来吧 呵呵~~~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-945820472964236719?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/945820472964236719/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=945820472964236719' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/945820472964236719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/945820472964236719'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2007/10/blog-post.html' title='好久没有更新了'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-4337518033042255497</id><published>2007-06-12T07:11:00.000-07:00</published><updated>2007-06-12T08:56:44.137-07:00</updated><title type='text'>lucene-Firstday</title><content type='html'>I will write some articles talking about lucene.&lt;br /&gt;Let's begin~~~&lt;br /&gt;Jarkarta Lucene (http://jakarta.apache.org/lucene/) is a high-performance, full-featured, java, open-source, text search engine API written by Doug Cutting.&lt;br /&gt;&lt;br /&gt;Note that Lucene is specifically an API, not an application. This means that all the hard parts have been done, but the easy programming has been left to you. The payoff for you is that, unlike normal search engine applications, you spend less time wading through tons of options and build a search application that is specifically suited to what you're doing. You can easily develop a custom search application, perfectly suited to your needs. Lucene is startlingly easy to develop with and use.&lt;br /&gt;&lt;br /&gt;I'm going to assume that you're a basically competent programmer and that you are basically competent in java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-4337518033042255497?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/4337518033042255497/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=4337518033042255497' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4337518033042255497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4337518033042255497'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2007/06/lucene-firstday.html' title='lucene-Firstday'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-4612553119175453720</id><published>2007-06-04T06:19:00.000-07:00</published><updated>2007-06-04T06:20:37.614-07:00</updated><title type='text'>from my senior school classmate</title><content type='html'>From xiaonei &lt;br /&gt;Published by Zhichao Shan&lt;br /&gt;&lt;br /&gt;已经酝酿很长时间的本文终于出场了。&lt;br /&gt;&lt;br /&gt;写本文的主要目的：1 很多人看了我前面大量的历史日志后，对我的数学水平产生了怀疑；2 有高中的校友师妹咨询关于大学数学学习的问题；3 概率论是数学中一个重要而美的分支，可惜多数同学尚没有机会看到其冰山一角。&lt;br /&gt;&lt;br /&gt;本文的读者适用范围：最低标准是学过工科专业的高等数学和概率论，最高标准不清楚（也许水平比我高的人就不屑于读了）&lt;br /&gt;&lt;br /&gt;当我跟皇上提到要写这篇文章的想法时，我提到：试图用比较短的篇幅让只要有初等概率论基础的人，也能看懂，从而对较深的概率论的研究对象和有趣的结论有一个初步的了解，激发其进一步深入学习概率论的兴趣。皇上说：那可不容易，相当于一个毕业设计了。我觉得，确实如此，本文是基本失败还是基本成功，还要看读者的评价。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;要想引入本文的内容，首先从数学美的定义说起。关于数学美，我比较欣赏的有两种观点，一是Birkhoff的观点，数学美=逻辑的复杂程度/表述的复杂程度；（注：那个/是除号的意思，就是说表述简单，但证明复杂，理论背景深刻的数学是好的数学，例如我下面给出的例子）二是Von Neumann的观点，数学的活力依赖于与它有联系的科学分支的多寡与分支的活力。也许做应用的人更喜欢后者，但我是比较喜欢前者的。因此，我下面的主要内容就是介绍一些概率论中的基本例子，这些例子的表述是相当简单的，但得到这些例子的手段却比较复杂。我将试图把每个例子表述清楚，让只要有初等概率论基础的读者就知道在说什么，但对得到这些结果的证明过程则一律省略，只简要提出涉及的基本工具，但其中有些比较简单的细节会给大家留为习题。这些例子一律来自伟大的Durrett的著作：Probability theory and examples——我认为最优秀的概率论教材。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;例1 Coupon collector问题：X1,X2,…是独立同分布，均匀的取自集合{1，…，n}的随机变量序列。大家把集合{1，…，n}想象为若干张扑克牌，每次我们等概率的取一张扑克牌，取完放回。t(n,k)=inf{m: /{X1,…,Xm}/=k}，意思就是手中取过k种不同的扑克牌所需的次数。T(n)=t(n,n)表示取过所有扑克牌所需的次数。X(n,k)=t (n,k)-t(n,k-1)，则X(n,k)服从参数是1-(k-1)/n的几何分布（思考题！），它的期望和方差可求，且容易发现X(n,1),…, X(n,n)相互独立，从而可以求出ET(n),Var T(n)（习题！)。且去证明（T(n)-ET(n)）/nlogn 依概率趋近于0.（数学基础稍微深一些的同学都知道，L2收敛蕴含依概率收敛）最终得到一个漂亮的结论：&lt;br /&gt;&lt;br /&gt;           T(n) / nlogn  依概率收敛于1.&lt;br /&gt;&lt;br /&gt;数学基础比较少的同学可以直接看这一行，我把这一行的实际意义说清楚：就是假设我们要收集的邮票有n张，而每次别人给我们提供的邮票恰恰是等概率的，那么要想把n张收集全，需要的时间依概率趋近于  nlogn。所以大家就可以发现，为什么我们想集邮时，初期集的比较快，但到快集齐时总是很难找到仅差的那几张，这就是因为上面的nlogn的阶大于线性函数。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;作为更为深层次的读者，我要说的是，在随机变量收敛性问题的研究中，独立性和矩总是常见的关注对象。为什么我们非常喜欢方差这个概念呢？我想一个重要的性质就是：对于独立的随机变量，方差对和有分配律。于是二阶中心矩才会成为最重要的矩。通过对矩的估计把随机变量的收敛性问题，转化为实数序列的收敛性问题，最后完全是数学分析的东西，这种手段是屡屡使用的。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;例2 非对称的简单随机游动问题：X1,X2,…独立同分布，P(X1=1)=p, P(X1=-1)=1-p=q,Sn=X1+…+Xn.&lt;br /&gt;&lt;br /&gt;对于数学基础不太好的同学，我简单介绍一下这个问题的背景，其实很好理解。设有一个点在0时刻位于实轴的原点0处，它在每个时刻以概率p向右跳跃一个单位长度，以概率q向左跳跃一个单位长度，且跳跃的方向与以前每次跳跃的情况是独立的。Sn表示的是：n时刻这个点所在的位置。&lt;br /&gt;&lt;br /&gt;我们有如下非常精彩的结论：&lt;br /&gt;&lt;br /&gt;1 Tx=inf{n:Sn=x} Tx的直观意思就是，这个点首次跳到x的位置的时刻。那么对于任意的a&lt; 0&lt; b，P(Ta &lt; Tb)=[  f(b)-f(0)  ] / [  f(b)-f(a)  ]  这里函数f(x)=[(1-p)/p]的x次幂。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;上面的这个等式的直观意义：a是负半轴上一点，b是正半轴上一点，点没到b之前先到a的概率被计算了出来。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;得到这个结论最快的方法就是用鞅论。鞅实在是一个漂亮的东西，而它的漂亮之处就在于它与停时结合在一起后的巨大威力。用N表示Ta和Tb中的较小值，则N是停时。首先要说明的是N小于无穷大。要得到这个结论，我掌握的有三种方法：&lt;br /&gt;&lt;br /&gt;（1） 通过EN小于无穷大，得到这个结论，这事实上是通过一个强的多的结论说明的，具体见Durrett书181页。&lt;br /&gt;&lt;br /&gt;（2） 通过鞅收敛定理，见Durrett书275页。其中用了一个重要结论：一致有界的鞅序列必然一致可积（应该是很显然的吧，呵呵）。&lt;br /&gt;&lt;br /&gt;（3） 通过马氏链的性质：对于一个有可列状态，不可约的马氏链，用F表示状态空间的一个有限子集，设初始状态属于F,用T表示链首次离开F的时间，则一定有T小于无穷大。（可以作为本科生三年级应用随机过程的习题，证之！）&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;2 ETb=b/(2p-1) 即首次到达b点的平均时间是b/(2p-1)。&lt;br /&gt;&lt;br /&gt;处理方法还是用鞅论，这里不再多说。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;关于用鞅论解决马氏链问题的例子，我还推荐数学基础比较高的同学阅读Durrett书上的（1）M/G/1排队（282页，298页，309页） （2）生灭过程（295页，301页）&lt;br /&gt;&lt;br /&gt;本来我认为这两个例子是更加漂亮的，但考虑到数学基础一般的同学的阅读水平，就不写了。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;例3 遍历定理的一个应用（Benford定律）&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;首先提一个问题：随机选取一个正整数，它的第一位数字是1 的概率是多少？&lt;br /&gt;&lt;br /&gt;很多同学会武断的回答：1/9.&lt;br /&gt;&lt;br /&gt;可是你忘记了问我一个问题：你是如何随机选取的？&lt;br /&gt;&lt;br /&gt;也许你会说：这还用问？就是等概率的选取呗。&lt;br /&gt;&lt;br /&gt;可是不要忘记，对于可列状态的状态空间，不存在一个概率测度，使得它在任意两个单点集上的概率相同！（思考题！）&lt;br /&gt;&lt;br /&gt;其实一个直观的想法是：我们考虑前n个正整数中（均匀分布是可能的），首位数字是1的概率记为f(n),然后把f(n)的极限作为我上面所提问题的答案。&lt;br /&gt;&lt;br /&gt;可是随后会不幸的发现，极限是不存在的！&lt;br /&gt;&lt;br /&gt;于是作为习题，设前ｎ个正整数中，首位数字是１的概率记为f1(n),则f1(n)的上极限是5/9,下极限是1/9，且对于任意属于区间 [1/9,5/9]的实数a，都存在f1（n）的子序列，它的极限就是a。类似的，记前n个正整数中，首位数字是2的概率是f2(n),其上极限是 10/27,下极限是1/18.（作为数学分析的习题！）&lt;br /&gt;&lt;br /&gt;但是，当我们转而思考这样的等比序列，1，2，4，8，16，…记这个序列的前n项中首位数字是1的概率为f1(n),则f1（n）是有极限的，且极限是 lg 2.一般地，对于任意一个非10的整数次幂的正整数q，考虑以1为首项，以q为公比的等比数列，它的前n项中首位数字是k的概率为f k（n）,则fk(n) 的极限是lg(k+1)-lgk.  （证明不可能在这里给出了，大家只管从结论中去欣赏概率论之美吧！）&lt;br /&gt;&lt;br /&gt;这个结论是非常漂亮的！叙述是非常简单的，意义是非常直观的，但并不是容易猜到的，证明所需的背景——遍历定理又是极其深刻的。读来畅快淋漓！&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;今年春天，陈大岳教授对我说，在现代概率论的研究中，遍历定理显现的越发重要。当看到上面这个结论后，我初步认识到遍历定理内涵的深刻和丰富。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;以上仅选取三个概率论的基本例子，它们的结论的直观易懂与其所需理论背景的复杂程度形成了鲜明的对比，体现了概率论作为一个数学分支的美妙。管中窥豹，可见一斑，希望能以此激发大家深入学习概率论的兴趣，使不同数学基础的同学都能有所收获。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-4612553119175453720?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/4612553119175453720/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=4612553119175453720' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4612553119175453720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/4612553119175453720'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2007/06/from-my-senior-school-classmate.html' title='from my senior school classmate'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-8140822457746181644</id><published>2007-05-23T13:18:00.000-07:00</published><updated>2007-05-23T13:24:26.496-07:00</updated><title type='text'>Within Temptation</title><content type='html'>Today I found a video in youtube  about the lost girl in UK.  I feel  quite  sad  for the girl, really.&lt;br /&gt;But life has to go on and on.&lt;br /&gt;&lt;br /&gt;I heard the song &lt;span style="font-size:180%;"&gt; &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;somewhere~~~~str0ngly recommend~~~&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I noticed these band and I introduce the band here:&lt;br /&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;span&gt;&lt;span&gt; Within Temptation is a metal band from the Netherlands. The band was founded in 1996 by Sharon den Adel and guitarist Robert Westerholt. Their music is variously described as symphonic metal and gothic metal, although in an interview, Sharon Den Adel said they fell into a symphonic rock genre.  by vocalist Directly after the release of their first album Enter, the band became prominent in the underground scene. It would however take until 2001, when they became known by the general public, with the single Ice Queen from the album Mother Earth, which reached position 2 in the charts. Since then, the band won the Conamus export prijs four years in a row. Their next album The Silent Force immediately reached first position in the charts. Their latest album, the The Heart of Everything also reached this position immediately.&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-8140822457746181644?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/8140822457746181644/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=8140822457746181644' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/8140822457746181644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/8140822457746181644'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2007/05/within-temptation.html' title='Within Temptation'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-3635349378281932750</id><published>2007-05-23T11:56:00.000-07:00</published><updated>2007-05-23T12:08:40.413-07:00</updated><title type='text'>want to creat an english blog with some interesting things</title><content type='html'>I think the new blog should contain topics about music, alcohol and  computer.&lt;br /&gt;The most interesting thing are to express my ideas, record my experience and introduce good music to my friends.&lt;br /&gt;ok. That's all, let's begin..............................&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-3635349378281932750?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/3635349378281932750/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=3635349378281932750' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3635349378281932750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/3635349378281932750'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2007/05/want-to-creat-english-blog-with-some.html' title='want to creat an english blog with some interesting things'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-152408093111260787</id><published>2006-12-31T17:03:00.000-08:00</published><updated>2006-12-31T17:11:22.938-08:00</updated><title type='text'>grounding</title><content type='html'>Today I read the &lt;&lt;identifying&gt;&gt;&lt;br /&gt;By:&lt;br /&gt;Kotaro Funakoshi and Takenobu Tokunaga&lt;br /&gt;From:&lt;br /&gt;Department of Computer Science,Tokyo Institute of Technology2-12-1 Oookayama Meguro, Tokyo, JAPAN{koh,take}@cl.cs.titech.ac.jp&lt;br /&gt;Great ideas.&lt;br /&gt;Also I found another article talking about grounding&lt;br /&gt;I think I have got to find some ways to realize the grounding if I want to add that into my system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-152408093111260787?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/152408093111260787/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=152408093111260787' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/152408093111260787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/152408093111260787'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2006/12/grounding.html' title='grounding'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5758308686553507147.post-7596294005697709101</id><published>2006-12-30T14:07:00.000-08:00</published><updated>2006-12-30T14:32:02.958-08:00</updated><title type='text'>build minipar under .net 2003 and 2005</title><content type='html'>1. download from &lt;a href="http://www.cs.ualberta.ca/~lindek/minipar.htm"&gt;http://www.cs.ualberta.ca/~lindek/minipar.htm&lt;/a&gt;,&lt;br /&gt;use Winrar to get minipar-0.5-Windows without .*,change it to zip, and then winrar again to get&lt;br /&gt;minipar-0.5-Windows&lt;br /&gt;-README&lt;br /&gt;-data&lt;br /&gt;-include&lt;br /&gt;-lib&lt;br /&gt;-pdemo&lt;br /&gt;&lt;br /&gt;3. and environment value “MINIPATH”，the value is “D:\MiniPar\minipar-0.5-Windows\data” which is the absolute path of -data&lt;br /&gt;&lt;br /&gt;4. after we setup the project which contains pdemo.cpp,&lt;br /&gt;open “Configuration Properites”&lt;br /&gt;see C/C++? then change "General"'s Additional Include Directories as the absolute path of -include&lt;br /&gt;see Linker? then change "General"'s Additional Library Directories as the absulte path of -lib-debug and add the "input"'s Additional Dependencies "minipar.lib Ws2_32.lib"&lt;br /&gt;5.  Build and under DOS  input "nameofoutputfile.exe -p "D:\MiniPar\minipar-0.5-Windows\data" ", wait for '&gt;' to appear&lt;br /&gt;and input a sentence once a line&lt;br /&gt;e.g.:&lt;br /&gt;&gt;Many students like programming.&lt;br /&gt;(&lt;br /&gt;E0 (() fin C * )&lt;br /&gt;1 (Many ~ Det 2 det (gov student))&lt;br /&gt;2 (students student N 3 s (gov like))&lt;br /&gt;3 (like ~ V E0 i (gov fin))&lt;br /&gt;E2 (() student N 3 subj (gov like) (antecedent 2))&lt;br /&gt;4 (programming ~ N 3 obj (gov like))&lt;br /&gt;5 (. ~ U * punc)&lt;br /&gt;)&lt;br /&gt;&gt;&lt;br /&gt;&lt;br /&gt;if you get the errors like me,  e.g. the link2005 error this following article may do help which I get from:&lt;a href="http://ckasj.vicp.net/blog/?p=106"&gt;http://ckasj.vicp.net/blog/?p=106&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title="Permanent Link to 深入lnk2005链接错误原因" href="http://ckasj.vicp.net/blog/?p=106" rel="bookmark"&gt;深入lnk2005链接错误原因&lt;/a&gt; 24 10月 2006&lt;br /&gt;近日在编译使用一个第三方的类库的时候总是出现 lnk2005的错误，郁闷之极。从网上看到了关于此链接错误的原因分析真是有种豁然开朗的感觉，此篇文章从编译器的内部行为分析lnk2005错误的起因，对此有了深入了解以后我们就可以从根本上解决lnk2005的错误。作者对一些概念和流程写的非常清楚，推荐阅读。&lt;br /&gt;&lt;a id="more-106"&gt;&lt;/a&gt;另外微软的技术支持网站也提供了&lt;a href="http://support.microsoft.com/kb/148652/zh-cn"&gt;lnk2005错误的原因分析和解决方法&lt;/a&gt;&lt;br /&gt;转载文章：&lt;br /&gt;许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误，而且通常是在使用第三方库时遇到的。对于这个问题，有的朋友可能不知其然，而有的朋友可能知其然却不知其所以然，那么本文就试图为大家彻底解开关于它的种种疑惑。大家都知道，从C/C++源程序到可执行文件要经历两个阶段:(1)编译器将源文件编译成汇编代码，然后由汇编器(assembler)翻译成机器指令(再加上其它相关信息)后输出到一个个目标文件(object file,VC的编译器编译出的目标文件默认的后缀名是.obj)中；(2)链接器(linker)将一个个的目标文件(或许还会有若干程序库)链接在一起生成一个完整的可执行文件。&lt;br /&gt;编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和弱(weak)两类传给汇编器，而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。那么何谓强弱呢？编译器认为函数与初始化了的全局变量都是强符号，而未初始化的全局变量则成了弱符号。比如有这么个源文件:&lt;br /&gt;extern int errorno;int buf[2] = {1,2};int *p;&lt;br /&gt;int main(){return 0;}&lt;br /&gt;其中main、buf是强符号，p是弱符号，而errorno则非强非弱，因为它只是个外部变量的使用声明。&lt;br /&gt;有了强弱符号的概念，我们就可以看看链接器是如何处理与选择被多次定义过的全局符号:&lt;br /&gt;规则1: 不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号)；&lt;br /&gt;规则2: 如果一个符号在某个目标文件中是强符号，在其它文件中都是弱符号，那么选择强符号；&lt;br /&gt;规则3: 如果一个符号在所有目标文件中都是弱符号，那么选择其中任意一个；&lt;br /&gt;由上可知多个目标文件不能重复定义同名的函数与初始化了的全局变量，否则必然导致LNK2005和LNK1169两种链接错误。可是，有的时候我们并没有在自己的程序中发现这样的重定义现象，却也遇到了此种链接错误，这又是何解？嗯，问题稍微有点儿复杂，容我慢慢道来。&lt;br /&gt;众所周知，ANSI C/C++ 定义了相当多的标准函数，而它们又分布在许多不同的目标文件中，如果直接以目标文件的形式提供给程序员使用的话，就需要他们确切地知道哪个函数存在于哪个目标文件中，并且在链接时显式地指定目标文件名才能成功地生成可执行文件，显然这是一个巨大的负担。所以C语言提供了一种将多个目标文件打包成一个文件的机制，这就是静态程序库(static library)。开发者在链接时只需指定程序库的文件名，链接器就会自动到程序库中寻找那些应用程序确实用到的目标模块，并把(且只把)它们从库中拷贝出来参与构建可执行文件。几乎所有的C/C++开发系统都会把标准函数打包成标准库提供给开发者使用(有不这么做的吗？)。&lt;br /&gt;程序库为开发者带来了方便，但同时也是某些混乱的根源。我们来看看链接器是如何解析(resolve)对程序库的引用的。&lt;br /&gt;在符号解析(symbol resolution)阶段，链接器按照所有目标文件和库文件出现在命令行中的顺序从左至右依次扫描它们，在此期间它要维护若干个集合:(1)集合E是将被合并到一起组成可执行文件的所有目标文件集合；(2)集合U是未解析符号(unresolved symbols，比如已经被引用但是还未被定义的符号)的集合；(3)集合D是所有之前已被加入到E的目标文件定义的符号集合。一开始，E、U、D都是空的。&lt;br /&gt;(1): 对命令行中的每一个输入文件f，链接器确定它是目标文件还是库文件，如果它是目标文件，就把f加入到E，并把f中未解析的符号和已定义的符号分别加入到U、D集合中，然后处理下一个输入文件。&lt;br /&gt;(2): 如果f是一个库文件，链接器会尝试把U中的所有未解析符号与f中各目标模块定义的符号进行匹配。如果某个目标模块m定义了一个U中的未解析符号，那么就把m加入到E中，并把m中未解析的符号和已定义的符号分别加入到U、D集合中。不断地对f中的所有目标模块重复这个过程直至到达一个不动点(fixed point)，此时U和D不再变化。而那些未加入到E中的f里的目标模块就被简单地丢弃，链接器继续处理下一输入文件。&lt;br /&gt;(3): 如果处理过程中往D加入一个已存在的符号，或者当扫描完所有输入文件时U非空，链接器报错并停止动作。否则，它把E中的所有目标文件合并在一起生成可执行文件。&lt;br /&gt;VC带的编译器名字叫cl.exe，它有这么几个与标准程序库有关的选项: /ML、/MLd、/MT、/MTd、/MD、/MDd。这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib)；/MT对应多线程静态版标准库(libcmt.lib)，此时编译器会自动定义_MT宏；/MD对应多线程DLL版(导入库msvcrt.lib，DLL是msvcrt.dll)，编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏，表示要使用对应标准库的调试版，因此/MLd对应调试版单线程静态标准库(libcd.lib)，/MTd对应调试版多线程静态标准库(libcmtd.lib)，/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib，DLL是msvcrtd.dll)。虽然我们的确在编译时明白无误地告诉了编译器应用程序希望使用什么版本的标准库，可是当编译器干完了活，轮到链接器开工时它又如何得知一个个目标文件到底在思念谁？为了传递相思，我们的编译器就干了点秘密的勾当。在cl编译出的目标文件中会有一个专门的区域(关心这个区域到底在文件中什么地方的朋友可以参考COFF和PE文件格式)存放一些指导链接器如何工作的信息，其中有一种就叫缺省库(default library)，这些信息指定了一个或多个库文件名，告诉链接器在扫描的时候也把它们加入到输入文件列表中(当然顺序位于在命令行中被指定的输入文件之后)。说到这里，我们先来做个小实验。写个顶顶简单的程序，然后保存为main.c :&lt;br /&gt;/* main.c */int main() { return 0; }&lt;br /&gt;用下面这个命令编译main.c(什么？你从不用命令行来编译程序？这个……) :&lt;br /&gt;cl /c main.c&lt;br /&gt;/c是告诉cl只编译源文件，不用链接。因为/ML是缺省选项，所以上述命令也相当于: cl /c /ML main.c 。如果没什么问题的话(要出了问题才是活见鬼！当然除非你的环境变量没有设置好，这时你应该去VC的bin目录下找到vcvars32.bat文件然后运行它。)，当前目录下会出现一个main.obj文件，这就是我们可爱的目标文件。随便用一个文本编辑器打开它(是的，文本编辑器，大胆地去做别害怕)，搜索”defaultlib”字符串，通常你就会看到这样的东西: “-defaultlib:LIBC -defaultlib:OLDNAMES”。啊哈，没错，这就是保存在目标文件中的缺省库信息。我们的目标文件显然指定了两个缺省库，一个是单线程静态版标准库libc.lib(这与/ML选项相符)，另外一个是oldnames.lib(它是为了兼容微软以前的C/C++开发系统)。&lt;br /&gt;VC的链接器是link.exe，因为main.obj保存了缺省库信息，所以可以用&lt;br /&gt;link main.obj libc.lib&lt;br /&gt;或者&lt;br /&gt;link main.obj&lt;br /&gt;来生成可执行文件main.exe，这两个命令是等价的。但是如果你用&lt;br /&gt;link main.obj libcd.lib&lt;br /&gt;的话，链接器会给出一个警告: “warning LNK4098: defaultlib “LIBC” conflicts with use of other libs; use /NODEFAULTLIB:library”，因为你显式指定的标准库版本与目标文件的缺省值不一致。通常来说，应该保证链接器合并的所有目标文件指定的缺省标准库版本一致，否则编译器一定会给出上面的警告，而LNK2005和LNK1169链接错误则有时会出现有时不会。那么这个有时到底是什么时候？呵呵，别着急，下面的一切正是为喜欢追根究底的你准备的。&lt;br /&gt;建一个源文件，就叫mylib.c，内容如下:&lt;br /&gt;/* mylib.c */#include&lt;br /&gt;void foo(){printf(”%s”,”I am from mylib!\n”);}&lt;br /&gt;用&lt;br /&gt;cl /c /MLd mylib.c&lt;br /&gt;命令编译，注意/MLd选项是指定libcd.lib为默认标准库。lib.exe是VC自带的用于将目标文件打包成程序库的命令，所以我们可以用&lt;br /&gt;lib /OUT:my.lib mylib.obj&lt;br /&gt;将mylib.obj打包成库，输出的库文件名是my.lib。接下来把main.c改成:&lt;br /&gt;/* main.c */void foo();&lt;br /&gt;int main(){foo();return 0;}&lt;br /&gt;用&lt;br /&gt;cl /c main.c&lt;br /&gt;编译，然后用&lt;br /&gt;link main.obj my.lib&lt;br /&gt;进行链接。这个命令能够成功地生成main.exe而不会产生LNK2005和LNK1169链接错误，你仅仅是得到了一条警告信息:”warning LNK4098: defaultlib “LIBCD” conflicts with use of other libs; use /NODEFAULTLIB:library”。我们根据前文所述的扫描规则来分析一下链接器此时做了些啥。&lt;br /&gt;一开始E、U、D都是空集，链接器首先扫描到main.obj，把它加入E集合，同时把未解析的foo加入U，把main加入D，而且因为main.obj的默认标准库是libc.lib，所以它被加入到当前输入文件列表的末尾。接着扫描my.lib，因为这是个库，所以会拿当前U中的所有符号(当然现在就一个foo)与my.lib中的所有目标模块(当然也只有一个mylib.obj)依次匹配，看是否有模块定义了U中的符号。结果mylib.obj确实定义了foo，于是它被加入到E，foo从U转移到D，mylib.obj引用的printf加入到U，同样地，mylib.obj指定的默认标准库是libcd.lib，它也被加到当前输入文件列表的末尾(在libc.lib的后面)。不断地在my.lib库的各模块上进行迭代以匹配U中的符号，直到U、D都不再变化。很明显，现在就已经到达了这么一个不动点，所以接着扫描下一个输入文件，就是libc.lib。链接器发现libc.lib里的printf.obj里定义有printf，于是printf从U移到D，而printf.obj被加入到E，它定义的所有符号加入到D，它里头的未解析符号加入到U。链接器还会把每个程序都要用到的一些初始化操作所在的目标模块(比如crt0.obj等)及它们所引用的模块(比如malloc.obj、free.obj等)自动加入到E中，并更新U和D以反应这个变化。事实上，标准库各目标模块里的未解析符号都可以在库内其它模块中找到定义，因此当链接器处理完libc.lib时，U一定是空的。最后处理libcd.lib，因为此时U已经为空，所以链接器会抛弃它里面的所有目标模块从而结束扫描，然后合并E中的目标模块并输出可执行文件。&lt;br /&gt;上文描述了虽然各目标模块指定了不同版本的缺省标准库但仍然链接成功的例子，接下来你将目睹因为这种不严谨而导致的悲惨失败。&lt;br /&gt;修改mylib.c成这个样子:&lt;br /&gt;#include&lt;br /&gt;void foo(){// just a test , don’t care memory leak_malloc_dbg( 1, _NORMAL_BLOCK, __FILE__, __LINE__ );}其中_malloc_dbg不是ANSI C的标准库函数，它是VC标准库提供的malloc的调试版，与相关函数配套能帮助开发者抓各种内存错误。使用它一定要定义_DEBUG宏，否则预处理器会把它自动转为malloc。继续用&lt;br /&gt;cl /c /MLd mylib.clib /OUT:my.lib mylib.obj&lt;br /&gt;编译打包。当再次用&lt;br /&gt;link main.obj my.lib&lt;br /&gt;进行链接时，我们看到了什么？天哪，一堆的LNK2005加上个贵为”fatal error”的LNK1169垫底，当然还少不了那个LNK4098。链接器是不是疯了？不，你冤枉可怜的链接器了，我拍胸脯保证它可是一直在尽心尽责地照章办事。&lt;br /&gt;一开始E、U、D为空，链接器扫描main.obj，把它加入E，把foo加入U，把main加入D，把libc.lib加入到当前输入文件列表的末尾。接着扫描my.lib，foo从U转移到D，_malloc_dbg加入到U，libcd.lib加到当前输入文件列表的尾部。然后扫描libc.lib，这时会发现libc.lib里任何一个目标模块都没有定义_malloc_dbg(它只在调试版的标准库中存在)，所以不会有任何一个模块因为_malloc_dbg而加入E，但是每个程序都要用到的初始化模块(如crt0.obj等)及它们所引用的模块(比如malloc.obj、free.obj等)还是会自动加入到E中，同时U和D被更新以反应这个变化。当链接器处理完libc.lib时，U只剩_malloc_dbg这一个符号。最后处理libcd.lib，发现dbgheap.obj定义了_malloc_dbg，于是dbgheap.obj加入到E，它里头的未解析符号加入U，它定义的所有其它符号也加入D，这时灾难便来了。之前malloc等符号已经在D中(随着libc.lib里的malloc.obj加入E而加入的)，而dbgheap.obj又定义了包括malloc在内的许多同名符号，这引发了重定义冲突，链接器只好中断工作并报告错误。&lt;br /&gt;现在我们该知道，链接器完全没有责任，责任在我们自己的身上。是我们粗心地把缺省标准库版本不一致的目标文件(main.obj)与程序库(my.lib)链接起来，导致了大灾难。解决办法很简单，要么用/MLd选项来重编译main.c；要么用/ML选项重编译mylib.c。&lt;br /&gt;在上述例子中，我们拥有库my.lib的源代码(mylib.c)，所以可以用不同的选项重新编译这些源代码并再次打包。可如果使用的是第三方的库，它并没有提供源代码，那么我们就只有改变自己程序的编译选项来适应这些库了。但是如何知道库中目标模块指定的默认库呢？其实VC提供的一个小工具便可以完成任务，这就是dumpbin.exe。运行下面这个命令&lt;br /&gt;dumpbin /DIRECTIVES my.lib&lt;br /&gt;然后在输出中找那些”Linker Directives”引导的信息，你一定会发现每一处这样的信息都会包含若干个类似”-defaultlib:XXXX”这样的字符串，其中XXXX便代表目标模块指定的缺省库名。&lt;br /&gt;知道了第三方库指定的默认标准库，再用合适的选项编译我们的应用程序，就可以避免LNK2005和LNK1169链接错误。喜欢IDE的朋友，你一样可以到 “Project属性” -&gt; “C/C++” -&gt; “代码生成(code generation)” -&gt; “运行时库(run-time library)” 项下设置应用程序的默认标准库版本，这与命令行选项的效果是一样的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5758308686553507147-7596294005697709101?l=shuguangli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shuguangli.blogspot.com/feeds/7596294005697709101/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5758308686553507147&amp;postID=7596294005697709101' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/7596294005697709101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5758308686553507147/posts/default/7596294005697709101'/><link rel='alternate' type='text/html' href='http://shuguangli.blogspot.com/2006/12/build-minipar-under-net-2003-and-2005.html' title='build minipar under .net 2003 and 2005'/><author><name>firstlight</name><uri>http://www.blogger.com/profile/12526247837717915897</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
