<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>fullfocus--年轻不怕失败</title>
    <description></description>
    <link>http://fullfocus.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>//pku1006 源代码分析</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/137210" style="color:red;">http://fullfocus.javaeye.com/blog/137210</a>&nbsp;
          发表时间: 2007年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="comment">//pku1006&nbsp;源代码分析</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//注释掉的是第一次写的，用的是穷举的方法，输出结//果都正确，但是time&nbsp;limited，想想也是哦，这么</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//做，三次循环，不超时才怪啊，</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//现在的代码采用逆推方法，一个循环，快多了：）</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//总结：写代码，首要的是解题思路要对头，要高效，//然后有可能才考虑代码优化，性能提高的问题！！！//切记！！</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">package</span><span>&nbsp;com.pku;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.*;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;java.util.*;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Pku1006&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">*&nbsp;@param&nbsp;args</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Scanner&nbsp;cin&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Scanner(</span><span class="keyword">new</span><span>&nbsp;BufferedInputStream(System.in));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">int</span><span>&nbsp;p&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">int</span><span>&nbsp;e&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">int</span><span>&nbsp;d&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">int</span><span>&nbsp;n&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">int</span><span>&nbsp;t&nbsp;=&nbsp;</span><span class="number">1</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">while</span><span>(cin.hasNext())&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>p&nbsp;=&nbsp;cin.nextInt();&nbsp;&nbsp;</span></li>
    <li class=""><span>e&nbsp;=&nbsp;cin.nextInt();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>i&nbsp;=&nbsp;cin.nextInt();&nbsp;&nbsp;</span></li>
    <li class=""><span>d&nbsp;=&nbsp;cin.nextInt();&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">if</span><span>(p&nbsp;==&nbsp;-</span><span class="number">1</span><span>)&nbsp;</span><span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>System.out.print(<span class="string">&quot;Case&quot;</span><span>+&nbsp;'&nbsp;'+&nbsp;t&nbsp;+&nbsp;</span><span class="string">&quot;:&nbsp;the&nbsp;next&nbsp;triple&nbsp;peak&nbsp;occurs&nbsp;in&nbsp;&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">for</span><span>(n&nbsp;=&nbsp;d+</span><span class="number">1</span><span>;&nbsp;n&lt;=</span><span class="number">21253</span><span>&nbsp;+&nbsp;d;n++)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">if</span><span>(Math.abs(n-p)%</span><span class="number">23</span><span>==</span><span class="number">0</span><span>&amp;&amp;Math.abs(n-e)%</span><span class="number">28</span><span>==</span><span class="number">0</span><span>&amp;&amp;Math.abs(n-i)%</span><span class="number">33</span><span>==</span><span class="number">0</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>System.out.println((n-d)+&nbsp;<span class="string">&quot;&nbsp;days.&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>t++;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//有的时候是思想方法不多，才使程序通不过，只有思想方法，解题方法正确以后，才考虑程序的优化问题，才有意义！</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;自已编写的可以得出正确结果，但是TIME&nbsp;LIMITED~:(</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;int&nbsp;nextPeak(int&nbsp;p,&nbsp;int&nbsp;e,&nbsp;int&nbsp;i,int&nbsp;d)</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;{</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;int&nbsp;x&nbsp;=&nbsp;0;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;for(x&nbsp;=&nbsp;1;&nbsp;x&nbsp;&lt;&nbsp;(21252+365)/23;&nbsp;x++)</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;for(int&nbsp;y=1;&nbsp;y&nbsp;&lt;&nbsp;(21252+365)/28;&nbsp;y++)</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;for(int&nbsp;z=1;&nbsp;z&nbsp;&lt;&nbsp;((21252+365)/33);&nbsp;z++)</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;{</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;if((p+23*x)&nbsp;==&nbsp;(e&nbsp;+&nbsp;28*y&nbsp;)&amp;&amp;&nbsp;(e&nbsp;+&nbsp;28*y)&nbsp;==&nbsp;(i&nbsp;+&nbsp;33*z))</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;{</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;if(&nbsp;p&nbsp;+&nbsp;23*x&nbsp;&lt;=&nbsp;d)</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;return&nbsp;nextPeak(d&nbsp;+&nbsp;23*x&nbsp;,d&nbsp;+&nbsp;23*x&nbsp;,d&nbsp;+&nbsp;23*x&nbsp;,d);</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;else&nbsp;return&nbsp;p&nbsp;+23*x&nbsp;-d;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;}</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;}</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;return&nbsp;p&nbsp;+23*x&nbsp;-d;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;}</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;Scanner&nbsp;cin&nbsp;=&nbsp;new&nbsp;Scanner(new&nbsp;BufferedInputStream(System.in));</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;Pku1006&nbsp;pku1006&nbsp;=&nbsp;new&nbsp;Pku1006();</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;int&nbsp;p&nbsp;=&nbsp;0;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;int&nbsp;e&nbsp;=&nbsp;0;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;int&nbsp;i&nbsp;=&nbsp;0;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;int&nbsp;d&nbsp;=&nbsp;0;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;int&nbsp;days&nbsp;=&nbsp;0;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;int&nbsp;k&nbsp;=&nbsp;1;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;int&nbsp;first&nbsp;=&nbsp;0;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;while(cin.hasNext())</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;{</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;if(&nbsp;(first&nbsp;=&nbsp;cin.nextInt())==&nbsp;-1)</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;{</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;if(cin.nextInt()==&nbsp;-1&amp;&amp;cin.nextInt()==&nbsp;-1&amp;&amp;cin.nextInt()==&nbsp;-1)</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;{</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;return;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;}</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;}</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;else{</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;p&nbsp;=&nbsp;first;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;e&nbsp;=&nbsp;cin.nextInt();</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;i&nbsp;=&nbsp;cin.nextInt();</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;d&nbsp;=&nbsp;cin.nextInt();</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;days&nbsp;=&nbsp;pku1006.nextPeak(p,e,i,d);</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;System.out.println(&quot;Case&nbsp;&quot;+k+&quot;:&nbsp;the&nbsp;next&nbsp;triple&nbsp;peak&nbsp;occurs&nbsp;in&nbsp;&quot;+days+&quot;&nbsp;days.&quot;);</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;k++;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;}</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;}</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;}</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/137210#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 Nov 2007 10:51:44 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/137210</link>
        <guid>http://fullfocus.javaeye.com/blog/137210</guid>
      </item>
      <item>
        <title>pku1005</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/136161" style="color:red;">http://fullfocus.javaeye.com/blog/136161</a>&nbsp;
          发表时间: 2007年10月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: rgb(0, 0, 255);">//http://acm.pku.edu.cn/JudgeOnline/<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="comment">//http://acm.pku.edu.cn/JudgeOnline/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">package</span><span>&nbsp;com.pku;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.*;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;java.util.*;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.lang.Math;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Pku1005&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">double</span><span>&nbsp;semisquare(</span><span class="keyword">double</span><span>&nbsp;x,&nbsp;</span><span class="keyword">double</span><span>&nbsp;y)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">double</span><span>&nbsp;length&nbsp;=&nbsp;Math.sqrt(x*x&nbsp;+&nbsp;y*y);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;Math.PI&nbsp;*&nbsp;length&nbsp;*length/</span><span class="number">2</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scanner&nbsp;cin&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Scanner(</span><span class="keyword">new</span><span>&nbsp;BufferedInputStream(System.in));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pku1005&nbsp;pku1005&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Pku1005();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;n&nbsp;=&nbsp;cin.nextInt();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">double</span><span>&nbsp;x&nbsp;=&nbsp;</span><span class="number">0</span><span>,&nbsp;y&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">double</span><span>&nbsp;square&nbsp;=&nbsp;</span><span class="number">0.0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">double</span><span>&nbsp;temp&nbsp;=&nbsp;</span><span class="number">0.0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">1</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>(i&nbsp;&lt;=&nbsp;n)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;cin.nextDouble();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;cin.nextDouble();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;square&nbsp;=&nbsp;pku1005.semisquare(x,&nbsp;y);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;Property&nbsp;&quot;</span><span>+&nbsp;i&nbsp;+</span><span class="string">&quot;:&nbsp;This&nbsp;property&nbsp;will&nbsp;begin&nbsp;eroding&nbsp;in&nbsp;year&nbsp;&quot;</span><span>+&nbsp;(</span><span class="keyword">int</span><span>)(square/</span><span class="number">50</span><span>+</span><span class="number">1</span><span>)&nbsp;+</span><span class="string">&quot;.&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;END&nbsp;OF&nbsp;OUTPUT.&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</span>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/136161#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 28 Oct 2007 17:25:58 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/136161</link>
        <guid>http://fullfocus.javaeye.com/blog/136161</guid>
      </item>
      <item>
        <title>pku1004</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/136148" style="color:red;">http://fullfocus.javaeye.com/blog/136148</a>&nbsp;
          发表时间: 2007年10月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.*;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;java.util.*;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.text.*;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Pku1004&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scanner&nbsp;cin&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Scanner(</span><span class="keyword">new</span><span>&nbsp;BufferedInputStream(System.in));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">double</span><span>&nbsp;output&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DecimalFormat&nbsp;f=&nbsp;<span class="keyword">new</span><span>&nbsp;DecimalFormat(</span><span class="string">&quot;#.00&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>(cin.hasNext()&amp;&amp;i&lt;</span><span class="number">12</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;+=&nbsp;cin.nextDouble();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println('$'+f.format(output/i));&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/136148#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 28 Oct 2007 15:00:16 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/136148</link>
        <guid>http://fullfocus.javaeye.com/blog/136148</guid>
      </item>
      <item>
        <title>基于英文单词的快速HASH索引算法</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/133223" style="color:red;">http://fullfocus.javaeye.com/blog/133223</a>&nbsp;
          发表时间: 2007年10月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>因为有项目需要，要做一个类似<span lang="EN-US">ispell 的软件，其中会产生大量的对单词的查找操作，于是经过一翻研究，得出以下HASH算法，经过验证比一般的查表的FNV HASH算法产生的分布曲线基本没什么两样，并且在大部分的不同字典下，本算法要比查表的FNV HASH算法表现出速度更快，分布更均匀。但是因为是实验结果，所以暂时还没得出有效的数学推论，但是从大量的不同的字典测试数据来看，此算法确实效率不 错。<br />
<br />
由于以前没有涉及过相关的纯算法的设计，所以刚刚开始的时候，打算随便选用一种HASH，比如说用%除大质数，然后借此搭建一个比较强壮的测试环境，然后打算根据测试结果来改进HASH算法的模型。<br />
<br />
最开始，我的HASH函数是这样的：<br />
unsigned int hash_func(char *str, int len)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register unsigned int sum = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register char *p = str;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(p - str &lt; len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum += *(p++);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sum % MAX_PRIME_LESS_THAN_HASH_LEN;<br />
}<br />
非常简单，但是这是绝对不可取的，通过这个函数，我选取了一个23w词的字典做为测试，当HASH SIZE=1024的时候，得到了以下的图象：<br />
<v:shapetype o:spt="75" coordsize="21600,21600" filled="f" id="_x0000_t75" stroked="f" path=" m@4@5 l@4@11@9@11@9@5 xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0 "></v:f><v:f eqn="sum @0 1 0 "></v:f><v:f eqn="sum 0 0 @1 "></v:f><v:f eqn="prod @2 1 2 "></v:f><v:f eqn="prod @3 21600 pixelWidth "></v:f><v:f eqn="prod @3 21600 pixelHeight "></v:f><v:f eqn="sum @0 0 1 "></v:f><v:f eqn="prod @6 1 2 "></v:f><v:f eqn="prod @7 21600 pixelWidth "></v:f><v:f eqn="sum @8 21600 0 "></v:f><v:f eqn="prod @7 21600 pixelHeight "></v:f><v:f eqn="sum @10 21600 0 "></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></span></p>
<p><img src="http://tarkey.kmip.net/image001.gif" border="0" align="bottom" hspace="0" alt="" /><br />
看得出震荡幅度相当大，那么如何来改进呢？首先想到可能产生的冲突的是这种情况：<span lang="EN-US">abcd和acbd，对于这两种单词来说，如果用上面的HASH函数，就一定会发生碰撞，为什么呢？因为每个字符少了关于它自己的位置信息，于是第一次改进版本的HASH函数就给每个字符加上了它的位置信息，将上面所描述的函数改进为：</span></p>
<p><span lang="EN-US">unsigned int hash_func(char *str, int len)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register unsigned int sum = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register char *p = str;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(p - str &lt; len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum += *(p++) * (p&ndash;str);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sum % MAX_PRIME_LESS_THAN_HASH_LEN;<br />
} <br />
得到以下图象：</span></p>
<p><span lang="EN-US"></span></p>
<p><br />
某种程度上来说，比不带位置信息产生的分布图要好多了，但是仍然非常的不均匀。那么接来分析产生分布不均匀的原因，因为是用的乘法，所以仍然太过于依赖字母产生的结果了。于是改用<span lang="EN-US">XOR操作，选用以下函数：</span></p>
<p><span lang="EN-US">unsigned int hash_func(char *str, int len)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register unsigned int sum = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register char *p = str;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(p - str &lt; len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum += (*(p++) * (p&ndash;str)) ^ sum;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sum % MAX_PRIME_LESS_THAN_HASH_LEN;<br />
} <br />
得到以下图象：</span></p>
<p><span lang="EN-US"><o:p>&nbsp;<br />
</o:p></span></p>
<p><span lang="EN-US"></span></p>
<p>上图虽然震荡幅度比较，不过做出来的<span lang="EN-US">regression line明显比上两张图片平得多了。但是结果仍然非常不好，从800到100的range太大。原因还是因为数据分布得不够均匀，于是思考单独的用加法来 算是不是不太好，根据其他查表类HASH算法的过程，发现其大多都用了高低位来组合成最后的结果，于是我也采用了他们的方法：</span></p>
<p><span lang="EN-US">unsigned int hash_func(char *str, int len)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register unsigned int sum = 0; <br />
<span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>register unsigned int h = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register unsigned short *p = (unsigned short *)str;<br />
<span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>register unsigned short *s = (unsigned short *)str;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(p - s &lt; len) <br />
<span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register unsigned short a = *(p++) * (p-s);<br />
<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>sum += sum ^ a; <br />
<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>h += a;<br />
<span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;((sum &lt;&lt; 16) | h) % MAX_PRIME_LESS_THAN_HASH_LEN;<br />
}</span></p>
<p>得到最终近似完美的图象：</p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><o:p>&nbsp;<br />
</o:p></span></p>
<p>最后得出结论，不用查表的方法，而通过字符串本身的位置对字符本身进行修正的方法也能得到结果相当满意的<span lang="EN-US">HASH函数，之后换了几个大小不同的字典进行测试，得出的图象都大致和上图一致，非常令人满意。对于这个项目，包括如何检查单词错误，和自动修正等等相关的内容，会随着项目的完成一一在整理成文档，希望大家支持。</span></p>
<p><span lang="EN-US">===============================================================================</span></p>
<h3>字符串hash算法比较</h3>
<div style="margin: 0pt auto;"> <iframe marginheight="0" scrolling="no" allowtransparency="true" src="http://blog.iyi.cn/tech/ad_300x250.html" marginwidth="0" frameborder="0" vspace="0" height="250" hspace="0" width="300"></iframe> </div>
<strong>1	概述</strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  链表查找的时间效率为O(N)，二分法为log2N，B+ Tree为log2N，但Hash链表查找的时间效率为O(1)。</td>
        </tr>
    </tbody>
</table>
设计高效算法往往需要使用Hash链表，常数级的查找速度是任何别的算法无法比拟的，Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响，然 而Hash函数是Hash链表最核心的部分，本文尝试分析一些经典软件中使用到的字符串Hash函数在执行效率、离散性、空间利用率等方面的性能问题。
<div id="a000412more">
<div id="more"> <strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">&nbsp;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  <strong> 2	经典字符串Hash函数介绍</strong></td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  作者阅读过大量经典软件原代码，下面分别介绍几个经典软件中出现的字符串Hash函数。</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  <strong>  2.1	PHP中出现的字符串Hash函数</strong></td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  static unsigned long hashpjw(char *arKey, unsigned int nKeyLength)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	unsigned long h = 0, g;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	char *arEnd=arKey+nKeyLength;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	while (arKey &lt; arEnd) {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		h = (h &lt;&lt; 4) + *arKey++;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		if ((g = (h &amp; 0xF0000000))) {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  			h = h ^ (g &gt;&gt; 24);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  			h = h ^ g;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		}</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	}</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	return h;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  <strong>  2.2	OpenSSL中出现的字符串Hash函数</strong></td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  unsigned long lh_strhash(char *str)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	int i,l;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	unsigned long ret=0;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	unsigned short *s;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	if (str == NULL) return(0);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	l=(strlen(str)+1)/2;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	s=(unsigned short *)str;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	for (i=0; i</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		ret^=(s[i]&lt;&lt;(i&amp;0x0f));</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	return(ret);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  } */</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  /* The following hash seems to work very well on normal text strings</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * no collisions on /usr/dict/words and it distributes on %2^n quite</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * well, not as good as MD5, but still good.</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   */</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  unsigned long lh_strhash(const char *c)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	unsigned long ret=0;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	long n;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	unsigned long v;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	int r;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	if ((c == NULL) || (*c == '\0'))</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		return(ret);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  /*</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	unsigned char b[16];</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	MD5(c,strlen(c),b);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	return(b[0]|(b[1]&lt;&lt;8)|(b[2]&lt;&lt;16)|(b[3]&lt;&lt;24)); </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  */</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	n=0x100;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	while (*c)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	{</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		v=n|(*c);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		n+=0x100;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		r= (int)((v&gt;&gt;2)^v)&amp;0x0f;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		ret=(ret(32-r));</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		ret&amp;=0xFFFFFFFFL;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		ret^=v*v;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		c++;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	}</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	return((ret&gt;&gt;16)^ret);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  在下面的测量过程中我们分别将上面的两个函数标记为OpenSSL_Hash1和OpenSSL_Hash2，至于上面的实现中使用MD5算法的实现函数我们不作测试。</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  <strong>  2.3	MySql中出现的字符串Hash函数</strong></td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  #ifndef NEW_HASH_FUNCTION</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  /* Calc hashvalue for a key */</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  static uint calc_hashnr(const byte *key,uint length)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    register uint nr=1, nr2=4;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    while (length--)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">      nr^= (((nr &amp; 63)+nr2)*((uint) (uchar) *key++))+ (nr &lt;&lt; 8);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">      nr2+=3;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    return((uint) nr);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	/* Calc hashvalue for a key, case indepenently */</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  static uint calc_hashnr_caseup(const byte *key,uint length)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    register uint nr=1, nr2=4;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    while (length--)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">      nr^= (((nr &amp; 63)+nr2)*((uint) (uchar) toupper(*key++)))+ (nr &lt;&lt; 8);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">      nr2+=3;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    return((uint) nr);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  #else</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  /*</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * Fowler/Noll/Vo hash</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   *</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * The basis of the hash algorithm was taken from an idea sent by email to the</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * IEEE Posix P1003.2 mailing list from Phong Vo (kpv@research.att.com) and</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * Glenn Fowler (gsf@research.att.com).  Landon Curt Noll (chongo@toad.com)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * later improved on their algorithm.</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   *</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * The magic is in the interesting relationship between the special prime</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * 16777619 (2^24 + 403) and 2^32 and 2^8.</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   *</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * This hash produces the fewest collisions of any function that we've seen so</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   * far, and works well on both numbers and strings.</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">   */</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  uint calc_hashnr(const byte *key, uint len)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    const byte *end=key+len;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    uint hash;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    for (hash = 0; key &lt; end; key++)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">      hash *= 16777619;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">      hash ^= (uint) *(uchar*) key;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    return (hash);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  uint calc_hashnr_caseup(const byte *key, uint len)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    const byte *end=key+len;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    uint hash;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    for (hash = 0; key &lt; end; key++)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">      hash *= 16777619;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">      hash ^= (uint) (uchar) toupper(*key);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">    return (hash);</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  #endif</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  Mysql中对字符串Hash函数还区分了大小写，我们的测试中使用不区分大小写的字符串Hash函数，另外我们将上面的两个函数分别记为MYSQL_Hash1和MYSQL_Hash2。</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  <strong>  2.4	另一个经验字符串Hash函数</strong></td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  unsigned int hash(char *str)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  {</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	register unsigned int  h;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	register unsigned char *p;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	for(h=0, p = (unsigned char *)str; *p ; p++)</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  		h = 31 * h + *p;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">        <br />
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  	return h;</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  }</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  <strong> 3	测试及结果</strong></td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  <strong>  3.1	测试说明</strong></td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14"> 从上面给出的经典字符串Hash函数中可以看出，有的涉及到字符串大小敏感问题，我们的测试中只考虑字符串大小写敏感的函数，另外在上面的函数中有的函数 需要长度参数，有的不需要长度参数，这对函数本身的效率有一定的影响，我们的测试中将对函数稍微作一点修改，全部使用长度参数，并将函数内部出现的计算长 度代码删除。</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  我们用来作测试用的Hash链表采用经典的拉链法解决冲突，另外我们采用静态分配桶（Hash链表长度）的方法来构造Hash链表，这主要是为了简化我们的实现，并不影响我们的测试结果。</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14"> 测试文本采用单词表，测试过程中从一个输入文件中读取全部不重复单词构造一个Hash表，测试内容分别是函数总调用次数、函数总调用时间、最大拉链长度、 平均拉链长度、桶利用率（使用过的桶所占的比率），其中函数总调用次数是指Hash函数被调用的总次数，为了测试出函数执行时间，该值在测试过程中作了一 定的放大，函数总调用时间是指Hash函数总的执行时间，最大拉链长度是指使用拉链法构造链表过程中出现的最大拉链长度，平均拉链长度指拉链的平均长度。 </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  测试过程中使用的机器配置如下：</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  PIII600笔记本，128M内存，windows 2000 server操作系统。</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  <strong>  3.2	测试结果</strong></td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">  以下分别是对两个不同文本文件中的全部不重复单词构造Hash链表的测试结果，测试结果中函数调用次数放大了100倍，相应的函数调用时间也放大了100倍。</td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" height="22" width="100%">
    <tbody>
        <tr>
            <td class="a14" height="18">
            <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_8_22_3a.jpg" border="0" alt="" /> </p>
            </td>
        </tr>
    </tbody>
</table>
<strong> </strong>
<table border="0" width="100%">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_8_22_3b.jpg" border="0" alt="" /> </p>
            </td>
        </tr>
    </tbody>
</table>
<strong>  从上表可以看出，这些经典软件虽然构造字符串Hash函数的方法不同，但是它们的效率都是不错的，相互之间差距很小，读者可以参考实际情况从其中借鉴使用。 </strong></div>
</div>
<p class="posted"><strong>Posted by david at November 15, 2005  3:05 PM</strong></p>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/133223#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 18 Oct 2007 16:21:40 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/133223</link>
        <guid>http://fullfocus.javaeye.com/blog/133223</guid>
      </item>
      <item>
        <title>Catalan 数--pku ACM 2084【待解决】</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/103543" style="color:red;">http://fullfocus.javaeye.com/blog/103543</a>&nbsp;
          发表时间: 2007年07月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp; 先来看看CATALAN数是怎么定义的。（http://www.ekany.com/wdg98/zhsx/2/2_11.htm）<br />
<h1><font size="4" color="#ff00ff">2.11 Catalan 数&nbsp;</font></h1>
<p>&nbsp;&nbsp;&nbsp; 这一节讨论Catalan数,其递推关系是非线性的,许多有意义的计数问题都导致这样的递推关系.本节将举出一些,后面还将见到.&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 一个凸n边形,通过不相交于n边形的对角线,把n边形拆分成若干三角形,不同拆分的数目用h<sub>n</sub>表示.例如五边形有如下五种拆分方案，故h<sub>n</sub>=5</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image005.gif" border="0" height="128" alt="" width="361" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 2-11-1&nbsp;</p>
<p>                             1.递推关系&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 定理：&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image007.gif" border="0" height="91" alt="" width="304" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <font color="#3333ff">证明：</font></p>
<p><font color="#3333ff">&nbsp;&nbsp;&nbsp; （a）的证明： 如图2－11－1所示， 以v<sub>1</sub>v<sub>n+1</sub>作为一个边    的三角形 ， 将凸n+1边形分割 成两部分，一部分是 k边形， 另一部分是n-k+2边形，k=2,3,<sup>...</sup>,n即v<sub>k</sub>点可以是v<sub>2</sub>,v<sub>3</sub>,<sup>...</sup>,v<sub>n</sub>点中任意一点。依据加法法则有&nbsp;</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image030.gif" border="0" height="69" alt="" width="235" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image016.gif" border="0" height="304" alt="" width="288" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333ff">图 2－11－3&nbsp;</font></p>
<p><font color="#3333ff">&nbsp;&nbsp;&nbsp; (b) 的证明： 如图2－11－3所示， 从v<sub>1</sub>点向其它n-3个顶点(v<sub>3</sub>,v<sub>4</sub>,<sup>...</sup>,v<sub>n-1</sub>)可引出n-3条对角线。对角线v<sub>1</sub>v<sub>k</sub>把n边形    分割成两个部分，因此 以v<sub>1</sub>v<sub>k</sub>对角线作为拆分线的方案数为h<sub>k</sub>h<sub>n-k+2。</sub></font></p>
<p><font color="#3333ff">&nbsp;&nbsp;&nbsp;<sub>&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image032.gif" border="0" height="238" alt="" width="272" /></sub></font></p>
<p><font color="#3333ff">&nbsp;&nbsp;&nbsp;v<sub>k</sub>可以是v<sub>3</sub>,v<sub>4</sub>,<sup>...</sup>,v<sub>n-1</sub>中任一点，对所有这些点求和得h<sub>3</sub>h<sub>n-1</sub>+h<sub>4</sub>h<sub>n-2</sub>+<sup>...</sup>+h<sub>n-2</sub>h<sub>4</sub>+h<sub>n-1</sub>h<sub>3</sub></font></p>
<p><font color="#3333ff">&nbsp;&nbsp;&nbsp;以v<sub>2</sub>,v<sub>3</sub>,<sup>...</sup>,v<sub>n</sub>取代    点也有类似的结果。但考虑到对角线有两个顶点，同一对角线在两个顶点分别计算了一次，作&nbsp;</font></p>
<p><font color="#3333ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image051.gif" border="0" height="41" alt="" width="319" /></font></p>
<p><font color="#3333ff">（2－11－3）式并不就给出剖分数，无疑其中是有重复的。其重复度是由于一个凸n边形的剖分有n-3条对角线，而对其每一条边计数时该剖分都计数了一次，故重复了n-3次即（2－11－3）式给出的结果是h<sub>n</sub>的n-3倍。&nbsp;</font></p>
<p><font color="#3333ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image054.gif" border="0" height="67" alt="" width="229" /></font></p>
<p><font color="#3333ff">（2－11－1）式和（2－11－2）式都是非线性的递推关系。</font>&nbsp;</p>
<p>      2.Catalan 数计算公式&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 由（2－11－1）式及h<sub>2</sub>=1故得&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image058.gif" border="0" height="109" alt="" width="300" /></p>
<p>由&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image060.gif" border="0" height="41" alt="" width="163" /></p>
<p>整理得&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image062.gif" border="0" height="24" alt="" width="161" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image064.gif" border="0" height="24" alt="" width="139" /></p>
<p>令&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.ekany.com/wdg98/zhsx/2/2_11.pic/image066.gif" border="0" height="24" alt="" width="80" /></p>
<p>&nbsp;&nbsp; <br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/103543#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Jul 2007 07:51:22 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/103543</link>
        <guid>http://fullfocus.javaeye.com/blog/103543</guid>
      </item>
      <item>
        <title>搞研究的人，打好数据基础哇</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/77574" style="color:red;">http://fullfocus.javaeye.com/blog/77574</a>&nbsp;
          发表时间: 2007年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>摘自<font face="Arial"><a href="http://qxred.yculblog.com/post.1176386.html">http://qxred.yculblog.com/post.1176386.html</a></font></p>
<p>越搞研究，越觉得以前数学没学好，越没学好，就越搞不出什么成果，沉痛教训啊</p>
<p>&gt; 1 空间解析几何<br />
&gt; 数学系第一学期，是最简单也是最基础的<br />
&gt; <br />
&gt; 2 数学分析<br />
&gt; 数学系第一、二、三学期的课程，是最基础最重要的课程，虽然学过这门课，但有时间的话还是建议重新去上一下第三学期多元微积分，这对于以后学习微分几何十分有益）<br />
&gt; <br />
&gt; 3 高等代数<br />
&gt; 数学系第二、三学期的课程，如果已有线性代数基础，可只听第三学期关于内积空间的课程，这门课对于我们研究有最直接的益处。<br />
&gt; <br />
&gt; 4 复变函数<br />
&gt; 数学系第四学期的课程，学这门课等于又将数学分析这门基础课的相关内容复习了一遍。我认为这门课是数学系学生学的最后一门比较简单的课程。<br />
&gt; <br />
&gt; 5 抽象代数<br />
&gt; 数学系第四学期的课程，主要是讲群、环、域方面的知识，大家在离散数学课程中应该学过这方面知识，只是数学系讲得再深入一点。<br />
&gt; <br />
&gt; 6实变函数<br />
&gt; 数学系第四学期的课程，我认为这门课是数学系专业学生和非数学系专业学生在数学知识差异上的分水岭，数学系的后续课程可以说是这门课的继续延伸，如拓扑学、微分几何等，就连他们的概率论也和我们学习的不大一样，他们是在实变函数的测度论基础上研究概率的。<br />
&gt; <br />
&gt; 7 概率论<br />
&gt; 数学系第五学期的课程，学习该课程需要实变函数中测度论的基础，学好这门课对我们的研究十分重要。我觉得我以前学的概率论太浅了，下学期我计划去再学一遍。<br />
&gt; <br />
&gt; 8 泛函分析<br />
&gt; 数学系第五学期的课程。<br />
&gt; <br />
&gt; 9 拓扑学<br />
&gt; 数学系第五学期的课程。<br />
&gt; <br />
&gt; 10 微分几何<br />
&gt; 数学系第六学期的课程，做流形学习研究不能不懂。<br />
&gt;&nbsp; <br />
&gt; 我认为以上十门课是我们要学习的核心课程。对于1，还好比较简单，我自己买了本书看。2中的多元微积分部分和3中的多项式理论与内积空间部分，我去年到数学系学了一下。现在正和04级数学系一道上4，5，6。计划下学期上7，8，9以及再下学期上10 微分几何。学习微分几何是我的最终目的，我买了本陈省身的《微分几何讲义》来看，根本看不懂。因此，我觉得还是该花一点时间去补一下课，否则我就永远不可能看懂。<br />
&gt;&nbsp; <br />
&gt; 学好这么多课要花不少时间。除了对数学分析、高等代数、概率论，我们有点基础以外，其余课程对我们来说是全新的。因此光听还不够，还要经常复习，才能保证一直能听得懂，否则听了几次就什么也听不懂了。学习这些课的时间更多的是花在复习和做习题的功夫上，听课其实倒花不了我们多少时间，数学系的课程大部分安排在早上一二节课，这可以让我们养成每天早起的好习惯。<br />
&gt;&nbsp; <br />
&gt; 同时，我们不同于数学系的本科生，我们的最终目的是研究，我们的时间都很有限，因此我们要摆正学习基础数学课程和做好当前研究工作的关系。这两者是一对矛盾，是既对立又统一的。从短期看，学习课程挤占了我们看论文写程序做研究的很多时间；但从长期看，学习这些课程，使我们掌握从事研究工作的利器。我们要两手抓，要补习数学课程和做好现阶段研究两不误。<br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/77574#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 May 2007 20:46:04 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/77574</link>
        <guid>http://fullfocus.javaeye.com/blog/77574</guid>
      </item>
      <item>
        <title>(转)log4j的详解</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/77228" style="color:red;">http://fullfocus.javaeye.com/blog/77228</a>&nbsp;
          发表时间: 2007年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="box2"><span class="Tit">(摘自百度搜索结果)</span></div>
<div class="box2"><span class="Tit">log4j</span></div>
<table class="htb wr" cellspacing="0" border="0" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td>
            <div class="box2 p14">在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。<br />
            <br />
            Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。<br />
            <br />
            此外，通过Log4j其他语言接口，您可以在C、C++、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。<br />
            <br />
            说明：下面分为三部分，第一部分讲解如何配置log4j，第二部分为对log4j.properties配置文件中的各个属性的讲解，第三部分为对log4j的详细讲解，如果只想配置上log4j，那么只需要看前两个部分就可以，如果想对log4j深入了解，则还需看第三部分。<br />
            <br />
            一、Log4j配置<br />
            <br />
            第一步：加入log4j-1.2.8.jar到lib下。<br />
            <br />
            第二步：在CLASSPATH下建立log4j.properties。内容如下：<br />
            <br />
            1 log4j.rootCategory=INFO, stdout , R<br />
            <br />
            2<br />
            <br />
            3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />
            <br />
            4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />
            <br />
            5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n<br />
            <br />
            6<br />
            <br />
            7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender<br />
            <br />
            8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log<br />
            <br />
            9 log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />
            <br />
            10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n<br />
            <br />
            11<br />
            <br />
            12 log4j.logger.com.neusoft=DEBUG<br />
            <br />
            13 log4j.logger.com.opensymphony.oscache=ERROR<br />
            <br />
            14 log4j.logger.net.sf.navigator=ERROR<br />
            <br />
            15 log4j.logger.org.apache.commons=ERROR<br />
            <br />
            16 log4j.logger.org.apache.struts=WARN<br />
            <br />
            17 log4j.logger.org.displaytag=ERROR<br />
            <br />
            18 log4j.logger.org.springframework=DEBUG<br />
            <br />
            19 log4j.logger.com.ibatis.db=WARN<br />
            <br />
            20 log4j.logger.org.apache.velocity=FATAL<br />
            <br />
            21<br />
            <br />
            22 log4j.logger.com.canoo.webtest=WARN<br />
            <br />
            23<br />
            <br />
            24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN<br />
            <br />
            25 log4j.logger.org.hibernate=DEBUG<br />
            <br />
            26 log4j.logger.org.logicalcobwebs=WARN<br />
            <br />
            第三步：相应的修改其中属性，修改之前就必须知道这些都是干什么的，在第二部分讲解。<br />
            <br />
            第四步：在要输出日志的类中加入相关语句：<br />
            <br />
            定义属性：protected final Log log = LogFactory.getLog(getClass());<br />
            <br />
            在相应的方法中：<br />
            <br />
            if (log.isDebugEnabled())<br />
            <br />
            {<br />
            <br />
            log.debug(&ldquo;System &hellip;..&rdquo;);<br />
            <br />
            }<br />
            <br />
            二、Log4j说明<br />
            <br />
            1 log4j.rootCategory=INFO, stdout , R<br />
            <br />
            此句为将等级为INFO的日志信息输出到stdout和R这两个目的地，stdout和R的定义在下面的代码，可以任意起名。等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL，如果配置OFF则不打出任何信息，如果配置为INFO这样只显示INFO, WARN, ERROR的log信息，而DEBUG信息不会被显示，具体讲解可参照第三部分定义配置文件中的logger。<br />
            <br />
            3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />
            <br />
            此句为定义名为stdout的输出端是哪种类型，可以是<br />
            <br />
            org.apache.log4j.ConsoleAppender（控制台），<br />
            <br />
            org.apache.log4j.FileAppender（文件），<br />
            <br />
            org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />
            <br />
            org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）<br />
            <br />
            org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
            <br />
            具体讲解可参照第三部分定义配置文件中的Appender。<br />
            <br />
            4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />
            <br />
            此句为定义名为stdout的输出端的layout是哪种类型，可以是<br />
            <br />
            org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
            <br />
            org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
            <br />
            org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
            <br />
            org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
            <br />
            具体讲解可参照第三部分定义配置文件中的Layout。<br />
            <br />
            5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n<br />
            <br />
            如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern，打印参数如下：<br />
            <br />
            %m 输出代码中指定的消息<br />
            <br />
            %p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL<br />
            <br />
            %r 输出自应用启动到输出该log信息耗费的毫秒数<br />
            <br />
            %c 输出所属的类目，通常就是所在类的全名<br />
            <br />
            %t 输出产生该日志事件的线程名<br />
            <br />
            %n 输出一个回车换行符，Windows平台为&ldquo;rn&rdquo;，Unix平台为&ldquo;n&rdquo;<br />
            <br />
            %d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />
            <br />
            %l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。<br />
            <br />
            [QC]是log信息的开头，可以为任意字符，一般为项目简称。<br />
            <br />
            输出的信息<br />
            <br />
            [TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'<br />
            <br />
            具体讲解可参照第三部分定义配置文件中的格式化日志信息。<br />
            <br />
            7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender<br />
            <br />
            此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。<br />
            <br />
            8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log<br />
            <br />
            此句为定义名为R的输出端的文件名为D:\Tomcat 5.5\logs\qc.log<br />
            <br />
            可以自行修改。<br />
            <br />
            9 log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />
            <br />
            与第4行相同。<br />
            <br />
            10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n<br />
            <br />
            与第5行相同。<br />
            <br />
            12 log4j.logger.com. neusoft =DEBUG<br />
            <br />
            指定com.neusoft包下的所有类的等级为DEBUG。<br />
            <br />
            可以把com.neusoft改为自己项目所用的包名。<br />
            <br />
            13 log4j.logger.com.opensymphony.oscache=ERROR<br />
            <br />
            14 log4j.logger.net.sf.navigator=ERROR<br />
            <br />
            这两句是把这两个包下出现的错误的等级设为ERROR，如果项目中没有配置EHCache，则不需要这两句。<br />
            <br />
            15 log4j.logger.org.apache.commons=ERROR<br />
            <br />
            16 log4j.logger.org.apache.struts=WARN<br />
            <br />
            这两句是struts的包。<br />
            <br />
            17 log4j.logger.org.displaytag=ERROR<br />
            <br />
            这句是displaytag的包。（QC问题列表页面所用）<br />
            <br />
            18 log4j.logger.org.springframework=DEBUG<br />
            <br />
            此句为Spring的包。<br />
            <br />
            24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN<br />
            <br />
            25 log4j.logger.org.hibernate=DEBUG<br />
            <br />
            此两句是hibernate的包。<br />
            <br />
            以上这些包的设置可根据项目的实际情况而自行定制。<br />
            <br />
            三、log4j详解<br />
            <br />
            1、定义配置文件<br />
            <br />
            Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件log4j.properties（键=值）。下面将介绍使用log4j.properties文件作为配置文件的方法:<br />
            <br />
            ①、配置根Logger<br />
            <br />
            Logger 负责处理日志记录的大部分操作。<br />
            <br />
            其语法为：<br />
            <br />
            log4j.rootLogger = [ level ] , appenderName, appenderName, &hellip;<br />
            <br />
            其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，只有等于及高于这个级别的才进行处理，则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志，OFF：关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。<br />
            <br />
            ②、配置日志信息输出目的地 Appender<br />
            <br />
            Appender 负责控制日志记录操作的输出。<br />
            <br />
            其语法为：<br />
            <br />
            log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
            <br />
            log4j.appender.appenderName.option1 = value1<br />
            <br />
            &hellip;<br />
            <br />
            log4j.appender.appenderName.optionN = valueN<br />
            <br />
            这里的appenderName为在①里定义的，可任意起名。<br />
            <br />
            其中，Log4j提供的appender有以下几种：<br />
            <br />
            org.apache.log4j.ConsoleAppender（控制台），<br />
            <br />
            org.apache.log4j.FileAppender（文件），<br />
            <br />
            org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />
            <br />
            org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），可通过log4j.appender.R.MaxFileSize=100KB设置文件大小，还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。<br />
            <br />
            org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
            <br />
            例如：log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />
            <br />
            定义一个名为stdout的输出目的地，ConsoleAppender为控制台。<br />
            <br />
            ③、配置日志信息的格式（布局）Layout<br />
            <br />
            Layout 负责格式化Appender的输出。<br />
            <br />
            其语法为：<br />
            <br />
            log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />
            <br />
            log4j.appender.appenderName.layout.option1 = value1<br />
            <br />
            &hellip;<br />
            <br />
            log4j.appender.appenderName.layout.optionN = valueN<br />
            <br />
            其中，Log4j提供的layout有以下几种：<br />
            <br />
            org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
            <br />
            org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
            <br />
            org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
            <br />
            org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
            <br />
            2、格式化日志信息<br />
            <br />
            Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下：<br />
            <br />
            %m 输出代码中指定的消息<br />
            <br />
            %p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL<br />
            <br />
            %r 输出自应用启动到输出该log信息耗费的毫秒数<br />
            <br />
            %c 输出所属的类目，通常就是所在类的全名<br />
            <br />
            %t 输出产生该日志事件的线程名<br />
            <br />
            %n 输出一个回车换行符，Windows平台为&ldquo;rn&rdquo;，Unix平台为&ldquo;n&rdquo;<br />
            <br />
            %d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />
            <br />
            %l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。<br />
            <br />
            3、在代码中使用Log4j<br />
            <br />
            我们在需要输出日志信息的类中做如下的三个工作：<br />
            <br />
            1、导入所有需的commongs-logging类：<br />
            <br />
            import org.apache.commons.logging.Log;<br />
            <br />
            import org.apache.commons.logging.LogFactory;<br />
            <br />
            2、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员：<br />
            <br />
            private final Log log = LogFactory.getLog(getClass());<br />
            <br />
            LogFactory.getLog()方法的参数使用的是当前类的class。<br />
            <br />
            3、使用org.apache.commons.logging.Log类的成员方法输出日志信息：<br />
            <br />
            if (log.isDebugEnabled())<br />
            <br />
            {<br />
            <br />
            log.debug(&quot;111&quot;);<br />
            <br />
            }<br />
            <br />
            if (log.isInfoEnabled())<br />
            <br />
            {<br />
            <br />
            log.info(&quot;222&quot;);<br />
            <br />
            }<br />
            <br />
            if (log.isWarnEnabled())<br />
            <br />
            {<br />
            <br />
            log.warn(&quot;333&quot;);<br />
            <br />
            }<br />
            <br />
            if (log.isErrorEnabled())<br />
            <br />
            {<br />
            <br />
            log.error(&quot;444&quot;);<br />
            <br />
            }<br />
            <br />
            if (log.isFatalEnabled())<br />
            <br />
            {<br />
            <br />
            log.fatal(&quot;555&quot;)<br />
            <br />
            }</div>
            </td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/77228#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 May 2007 22:53:19 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/77228</link>
        <guid>http://fullfocus.javaeye.com/blog/77228</guid>
      </item>
      <item>
        <title>Eclipse不能编译，不能产生class文件的解决方案</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/75453" style="color:red;">http://fullfocus.javaeye.com/blog/75453</a>&nbsp;
          发表时间: 2007年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 以前也碰到过这个问题，还以为Eclipse的问题，只是傻傻的化大时间去重装一边Eclipse，今天又碰到这个问题了， JAVA类完全正确， 引入的包也正确，设置的输出路径也正确，当我用Clean命令后，Eclipse再也不肯把java文件编译成class了，立马去网上找，都说没有开自动编译命令，但是我都开了啊。。。。不行自己研究。。</p>
<p>&nbsp;&nbsp; 哇，总有发现新大陆了：</p>
<p>&nbsp;&nbsp; 在 project--&gt;source里面，发现提示： 1 source folder path missing....</p>
<p>&nbsp;&nbsp; 原来， 我直接把missing的文件给删掉了， 回到工程界面后，class文件自动跳出来了，3K GOD。。<img src="/javascripts/fckeditor/editor/images/smiley/msn/thumbs_up.gif" alt="" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/75453#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Apr 2007 11:53:17 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/75453</link>
        <guid>http://fullfocus.javaeye.com/blog/75453</guid>
      </item>
      <item>
        <title>一个搜索引擎开发者论坛</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/70713" style="color:red;">http://fullfocus.javaeye.com/blog/70713</a>&nbsp;
          发表时间: 2007年04月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          临近毕业，而毕设正是搜索引擎相关课题： web搜索结果聚类, 以前也研究过搜索引擎，而且很感兴趣，所以趁着这个东风，建立了一个搜索引擎开发者交流社区，根据自己的一些经验，把论坛分成了几个板块， 基础学习区，开源代码研究，开发与应用等相关模块，希望对搜索引擎感兴趣的同仁来社区一起探讨，研究，学习，进步，特别欢迎有搜索引擎开发经验的前辈来共同维护好这个社区，感谢大家的支持！ <br /> 社区网址是： http://www.zhuayu.net
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/70713#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Apr 2007 19:06:35 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/70713</link>
        <guid>http://fullfocus.javaeye.com/blog/70713</guid>
      </item>
      <item>
        <title>(转)BeanShell快速入门---Java应用程序脚本引擎</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/67047" style="color:red;">http://fullfocus.javaeye.com/blog/67047</a>&nbsp;
          发表时间: 2007年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天研究Carrot2源代码，查看其的整个数据流程，发现他把很多变动的东西用组件的形式来实现，而通过脚本来跟应用程序建立纽带。这个脚本就是BeanShell，发现还挺好用，转载一片不错的文章。</p>
<p>&nbsp;</p>
<table class="showinfo" cellspacing="0" border="0" align="center" width="100%" cellpadding="3" style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all">
    <tbody>
        <tr>
            <td class="showTitle" align="center">BeanShell快速入门---Java应用程序脚本引擎</td>
        </tr>
        <tr>
            <td>
            <table cellspacing="0" border="0" width="100%" cellpadding="5">
                <tbody>
                    <tr>
                        <td height="5" align="center"><a href="http://www.daima.com.cn/Info/55/Info32134/">http://www.daima.com.cn/Info/55/Info32134/</a></td>
                    </tr>
                    <tr>
                        <td>
                        <p><br />
                        </p>
                        <p><strong><font size="5">快速入门</font></strong></p>
                        <p>欢迎使用BeanShell.这是一个速成课程。我们将省去一些重要的选项和细节。要学习更多的内容请看本User's Guide的其它部分。</p>
                        <p><strong><font size="5">下载和运行BeanShell</font></strong></p>
                        <p>请到<a href="http://www.beanshell.org/">http://www.beanshell.org</a>下载最新的JAR文件。你可以用图形桌面模式和命令行模式起动BeanShell。<br />
                        如果你只是要玩一玩BeanShell，你可以在BeanShell的jar文件上双击来起动BeanShell的桌面。但不管怎样，如果你要让BeanShell与你的类与应用程序一起工作就必须将BeanShell的jar文件加到classpath中。<br />
                        你可以将BeanShell的jar文件拖到JAVA_HOME的ext目录也可以直接加到classpath中。</p>
                        <ul>
                            <li><font color="#0000ff">windows用户请将bsh.jar放在JAVA_HOME/jre/lib/ext文件夹，OSX用户可以放在/Library/Java/Extensions.<br />
                            或者增加BeanShell到你的classpath目录，如：<br />
                            unix:&nbsp;export CLASSPATH=$CLASSPATH:bsh-xx.jar<br />
                            windows:set classpath %classpath%;bsh-xx.jar</font><br />
                            </li>
                        </ul>
                        <p>然后你就可以运行BeanShell在GUI或命令行模式：</p>
                        <ul>
                            <li><font color="#0000ff">&nbsp;java bsh.Console&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // run the graphical desktop<br />
                            or<br />
                            &nbsp;&nbsp;&nbsp; &nbsp;java bsh.Interpreter&nbsp;&nbsp; // run as text-only on the command line<br />
                            or<br />
                            &nbsp;&nbsp;&nbsp; &nbsp;java bsh.Interpreter filename [ args ] // run script file</font> </li>
                        </ul>
                        <p>可以在你的应用程序内部来运行,也可以作为debug及servlet的远程服务器模式,或一个Applet内部来运行BeanShell。请参考&quot;BeanShell Modes of Operation&quot;获得更多详情。</p>
                        <p><font size="5"><strong>BeanShell GUI</strong></font></p>
                        <p>用GUI模式启动BeanShell后，将打开一个桌面视窗。用鼠标右击在桌面的背景上，你可以打开另一个控制台视窗及其它的工具如一个简单的类游览器。<br />
                        每一个控制台视窗运行一个独立的BeanShell解释器。这个图形化的控制台支持基本的历史命令，行编辑，剪切和粘贴，甚至类和变量名的自动完成功能。从控制台你能开启一个简单的编辑视窗。在它里面，你可以编写脚本和使用&lsquo;eval&rsquo;选项求表达式的值。</p>
                        <p><font size="5"><strong>Java语句和表达式</strong></font></p>
                        <p>BeanShell能理解标准的JAVA语句，表达式，和方法宣告。语句和表达式的内容可以是：变量，宣告，赋值，方法调用，循环，条件等。<br />
                        在Java程序中你必须严格的使用它们，但在BeanShell中，你可以用&ldquo;宽松类型&rdquo;(loosely typed)的方式来使用它们。也就是说，你可以在写脚本时偷懒，不进行变量类型的宣告(在原始数据类型和对象都可以)。如果你试着用错变量类型，BeanShell将会给出一个错误。<br />
                        这里有一些例子：</p>
                        <ul>
                            <li><font color="#0000ff">foo = &quot;Foo&quot;;&nbsp;&nbsp;&nbsp; <br />
                            four = (2 + 2)*2/2;<br />
                            print( foo + &quot; = &quot; + four );&nbsp; // print() is a BeanShell command<br />
                            // Do a loop<br />
                            for (i=0; i&lt;5; i++)<br />
                            &nbsp;&nbsp;&nbsp; print(i);&nbsp;&nbsp; <br />
                            // Pop up a frame with a button in it<br />
                            button = new JButton( &quot;My Button&quot; );<br />
                            frame = new JFrame( &quot;My Frame&quot; );<br />
                            frame.getContentPane().add( button, &quot;Center&quot; );<br />
                            frame.pack();<br />
                            frame.setVisible(true);</font> </li>
                        </ul>
                        <p><strong><font size="5">有用的BeanShell命令</font></strong></p>
                        <p>在刚才那个例子中我们用了一个内建在BeanShell中的一个方便的命令print(),来显示变量的值。print()跟ava的System.out.println()非常的相像，除非它能保证输出总是命令行。print()也可以显示一些对象的类型(如数组)，但比Java的更详细。另一个相关的命令是show(),用来开启与关闭显示你输入的每一行的结果。<br />
                        这儿是一些其它的BeanShell的命令：<br />
                        source(), run() - 将一个bsh脚本读到解释器或运行在另一个解释器。 <br />
                        frame() - 显示一个Frame或JFrame的GUI组件. <br />
                        load(), save() - 载入和保存一个序列化的对象到一个文件. <br />
                        cd(), cat(), dir(), pwd(), etc. - 类unix的shell命令。 <br />
                        exec() - 运行一个本地的程序。<br />
                        javap() - 打印一个对象的方法和字段，类似于Java的javap命令。<br />
                        setAccessibility() - 开启无限制的存取private 和protected的组件。<br />
                        要获得更多的信息请查看BeanShell命令的详细清单。</p>
                        <p><em>提示:</em><br />
                        BeanShell命令并不是真的&quot;内建&quot;其中的，而是作为脚本方法自动从classpath载入的. 你可以扩展基本命令集并加到classpath中作为自订义的脚本来使用。</p>
                        <p><font size="5"><strong>脚本方法</strong></font></p>
                        <p>你可以在bsh中宣告和使用方法，就像在java的类中一样。</p>
                        <ul>
                            <li><font color="#0033ff">int addTwoNumbers( int a, int b ) {<br />
                            &nbsp;&nbsp;&nbsp; return a + b;<br />
                            }<br />
                            sum = addTwoNumbers( 5, 7 );&nbsp; // 12</font> </li>
                        </ul>
                        <p>bsh的方法可以有动态的(宽松的)参数和返回类型。</p>
                        <ul>
                            <li><font color="#0000ff">add( a, b ) {<br />
                            &nbsp;&nbsp;&nbsp; return a + b;<br />
                            }<br />
                            foo = add(1, 2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 3<br />
                            foo = add(&quot;Oh&quot;, &quot; baby&quot;);&nbsp;&nbsp; // &quot;Oh baby&quot;</font> </li>
                        </ul>
                        <p><font size="5"><strong>实现Interface</strong></font></p>
                        <p>注意：如果要BeanShell能实现任意的Interface，必须有jdk1.3及以上支持。<br />
                        你可以在脚本中用标准的Java内部类的语法来实现Interface.例如：</p>
                        <ul>
                            <li><font color="#0000ff">ActionListener scriptedListener = new ActionListener() {<br />
                            &nbsp;&nbsp;&nbsp; actionPerformed( event ) { ... }<br />
                            }</font> </li>
                        </ul>
                        <p>你可以不用实现Interface的所有方法，而只用实现你需要的方法。如果代码中调用了未被实现的方法，将丢出异常。如果你想重载大量的方法的行为--例如为日志生成一个&quot;哑&quot;适配器--你可以在脚本对象中实现一个特殊的方法:invoke(name,args)。invoke()方法用来处理任何未被定义的方法的调用:</p>
                        <ul>
                            <li><font color="#0033ff">ml = new MouseListener() {<br />
                            &nbsp;&nbsp;&nbsp; mousePressed( event ) { ... }<br />
                            &nbsp;&nbsp;&nbsp; // handle the rest<br />
                            &nbsp;&nbsp;&nbsp; invoke( name, args ) { print(&quot;Method: &quot;+name+&quot; invoked!&quot;);<br />
                            }</font> </li>
                        </ul>
                        <p><font size="5"><strong>脚本对象</strong></font></p>
                        <p>在BeanShell中，和在JavaScript与Perl中一样，脚本对象是用封闭的方法体一构成的。通过在方法未尾返回一个特殊值&quot;this&quot;，你就可以像使用方法一样调用这个对象了。在这个方法调用时，你可以给与它任何的值。通常对象内部需要包括方法，所以BeanShell的脚本方法在一定程度上可再包含一些方法以构成脚本对象。例如：</p>
                        <ul>
                            <li><font color="#0000ff">foo() {<br />
                            &nbsp;&nbsp;&nbsp; print(&quot;foo&quot;);<br />
                            &nbsp;&nbsp;&nbsp; x=5;<br />
                            &nbsp;&nbsp;&nbsp; bar() {<br />
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(&quot;bar&quot;);<br />
                            &nbsp;&nbsp;&nbsp; }<br />
                            &nbsp;&nbsp;&nbsp; return this;<br />
                            }<br />
                            myfoo = foo();&nbsp;&nbsp;&nbsp; // prints &quot;foo&quot;<br />
                            print( myfoo.x ); // prints &quot;5&quot;<br />
                            myfoo.bar();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // prints &quot;bar&quot;</font> </li>
                        </ul>
                        <p>如果这些代码对你来说很陌生，别急，请用户手册可得到更透彻的解释。</p>
                        <p>在你的脚本中，BeanShell脚本对象(也就是先前例子中的&quot;this&quot;参照)能自动实现任何JAVA介面类型。当JAVA代码调用相应与之通讯的脚本方法内的方法。当你试着将脚本对象作为参数传给Java方法时，BeanShell会自动将它造型(cast)为相应的类型。如要传递BeanShell外部的对象时，你可以在需要时显式的进行造型(cast).请看用户手册中的详细内容。</p>
                        <p><strong><font size="5">从你的应用程序调用BeanShell</font></strong></p>
                        <p>通过建立一个BeanShell解释器，使用eval()或source()命令，你可以在你的应用程序中求文本表达式的值和运行脚本。如果你希望在你的脚本内部使用一个对象，可以用set()方法传递对象的变量参照给BeanShell,并通过get()方法取得结果。</p>
                        <ul>
                            <li><font color="#0000ff">import bsh.Interpreter;<br />
                            Interpreter i = new Interpreter();&nbsp; // Construct an interpreter<br />
                            i.set(&quot;foo&quot;, 5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set variables<br />
                            i.set(&quot;date&quot;, new Date() ); <br />
                            Date date = (Date)i.get(&quot;date&quot;);&nbsp;&nbsp;&nbsp; // retrieve a variable<br />
                            // Eval a statement and get the result<br />
                            i.eval(&quot;bar = foo*10&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
                            System.out.println( i.get(&quot;bar&quot;) );<br />
                            // Source an external script file<br />
                            i.source(&quot;somefile.bsh&quot;);</font> </li>
                        </ul>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://fullfocus.javaeye.com/blog/67047#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 01 Apr 2007 11:00:32 +0800</pubDate>
        <link>http://fullfocus.javaeye.com/blog/67047</link>
        <guid>http://fullfocus.javaeye.com/blog/67047</guid>
      </item>
      <item>
        <title>(转)中文搜索引擎技术揭密:中文分词</title>
        <author>fullfocus</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fullfocus.javaeye.com">fullfocus</a>&nbsp;
          链接：<a href="http://fullfocus.javaeye.com/blog/66508" style="color:red;">http://fullfocus.javaeye.com/blog/66508</a>&nbsp;
          发表时间: 2007年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td height="40" align="center"><center><span style="FONT-WEIGHT: bold; FONT-SIZE: 14px; LINE-HEIGHT: 20px">中文搜索引擎技术揭密:中文分词</span><br />
            <a href="http://www.fullsearcher.com/" style="LINE-HEIGHT: 20px">http://FullSearch.Com </a><a href="http://www.fullsearcher.com/">中文全文检索网</a> 2005-1-13 8:35:56 winter</center></td>
        </tr>
        <tr>
            <td style="PADDING-LEFT: 15px; HEIGHT: 25px">关键词：<a href="http://www.fullsearcher.com/search.asp?query=%D6%D0%CE%C4%CB%D1%CB%F7%D2%FD%C7%E6%BC%BC%CA%F5%BD%D2%C3%DC" target="_blank">中文搜索引擎技术揭密</a> </td>
        </tr>
        <tr>
            <td height="300" valign="top" style="PADDING-RIGHT: 20px; PADDING-LEFT: 15px; LINE-HEIGHT: 17px">
            <p><br />
            &nbsp;&nbsp;&nbsp; 信息的飞速增长，使搜索引擎成为人们查找信息的首选工具，Google、百度、中国搜索等大型搜索引擎一直是人们讨论的话题。随着搜索市场价值的不断增加，越来越多的公司开发出自己的搜索引擎，阿里巴巴的商机搜索、8848的购物搜索等也陆续面世，自然，搜索引擎技术也成为技术人员关注的热点。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 搜索引擎技术的研究，国外比中国要早近十年，从最早的Archie，到后来的Excite，以及altvista、overture、google等搜索引擎面世，搜索引擎发展至今，已经有十几年的历史，而国内开始研究搜索引擎是在上世纪末本世纪初。在许多领域，都是国外的产品和技术一统天下，特别是当某种技术在国外研究多年而国内才开始的情况下。例如操作系统、字处理软件、浏览器等等，但搜索引擎却是个例外。虽然在国外搜索引擎技术早就开始研究，但在国内还是陆续涌现出优秀的搜索引擎，像百度（<a href="http://www.baidu.com/"><font color="#800080">http://www.baidu.com</font></a>）、中搜（<a href="http://www.zhongsou.com/">http://www.zhongsou.com</a>）等。目前在中文搜索引擎领域，国内的搜索引擎已经和国外的搜索引擎效果上相差不远。之所以能形成这样的局面，有一个重要的原因就在于中文和英文两种语言自身的书写方式不同，这其中对于计算机涉及的技术就是中文分词。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; <strong>什么是中文分词</strong></p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 众所周知，英文是以词为单位的，词和词之间是靠空格隔开，而中文是以字为单位，句子中所有的字连起来才能描述一个意思。例如，英文句子I am a student，用中文则为：&ldquo;我是一个学生&rdquo;。计算机可以很简单通过空格知道student是一个单词，但是不能很容易明白&ldquo;学&rdquo;、&ldquo;生&rdquo;两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词，就是中文分词，有些人也称为切词。我是一个学生，分词的结果是：我 是 一个 学生。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; <strong>中文分词和搜索引擎</strong></p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 中文分词到底对搜索引擎有多大影响？对于搜索引擎来说，最重要的并不是找到所有结果，因为在上百亿的网页中找到所有结果没有太多的意义，没有人能看得完，最重要的是把最相关的结果排在最前面，这也称为相关度排序。中文分词的准确与否，常常直接影响到对搜索结果的相关度排序。笔者最近替朋友找一些关于日本和服的资料，在搜索引擎上输入&ldquo;和服&rdquo;，得到的结果就发现了很多问题。下面就以这个例子来说明分词对搜索结果的影响，在现有三个中文搜索引擎上做测试，测试方法是直接在Google（<a href="http://www.google.com/">http://www.google.com</a>）、百度（<a href="http://www.baidu.com/"><font color="#800080">http://www.baidu.com</font></a>）、中搜（<a href="http://www.zhongsou.com/">http://www.zhongsou.com</a>）上以&ldquo;和服&rdquo;为关键词进行搜索：</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; <u>在Google上输入&ldquo;和服&rdquo;搜索所有中文简体网页，总共结果507,000条，前20条结果中有14条与和服一点关系都没有。在第一页就有以下错误：</u></p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; &ldquo;通信信息报：瑞星以技术和服务开拓网络安全市场&rdquo;</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; &ldquo;使用纯HTML的通用数据管理和服务- 开发者- ZDNet ...&rdquo;</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; &ldquo;陈慧琳《心口不一》化妆和服装自己包办&rdquo;</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; &ldquo;::外交部：中国境外领事保护和服务指南(2003年版) ...&rdquo;</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; &ldquo;产品和服务&rdquo;</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 等等。第一页只有三篇是真正在讲&ldquo;和服&rdquo;的结果。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; <u>在百度上输入&ldquo;和服&rdquo;搜索网页，总共结果为287,000条，前20条结果中有6条与和服一点关系都没有。在第一页有以下错误：</u></p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; &ldquo;福建省晋江市恒和服装有限公司系独资企业&rdquo;</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; &ldquo;关于商品和服务实行明码标价的规定&rdquo;</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; &ldquo;青岛东和服装设备&rdquo;</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; <u>在中搜上输入&ldquo;和服&rdquo;搜索网页，总共结果为26,917条，前20条结果都是与和服相关的网页。</u></p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 这次搜索引擎结果中的错误，就是由于分词的不准确所造成的。通过笔者的了解，Google的中文分词技术采用的是美国一家名叫Basis Technology（<a href="http://www.basistech.com/">http://www.basistech.com</a>）的公司提供的中文分词技术，百度使用的是自己公司开发的分词技术，中搜使用的是国内海量科技（<font color="#800080">http://www.hylanda.com</font>）提供的分词技术。由此可见，中文分词的准确度，对搜索引擎结果相关性和准确性有相当大的关系。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; <strong>中文分词技术</strong></p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 中文分词技术属于自然语言处理技术范畴，对于一句话，人可以通过自己的知识来明白哪些是词，哪些不是词，但如何让计算机也能理解？其处理过程就是分词算法。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 现有的分词算法可分为三大类：基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; <u>1、基于字符串匹配的分词方法</u></p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 这种方法又叫做机械分词方法，它是按照一定的策略将待分析的汉字串与一个&ldquo;充分大的&rdquo;机器词典中的词条进行配，若在词典中找到某个字符串，则匹配成功（识别出一个词）。按照扫描方向的不同，串匹配分词方法可以分为正向匹配和逆向匹配；按照不同长度优先匹配的情况，可以分为最大（最长）匹配和最小（最短）匹配；按照是否与词性标注过程相结合，又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下：</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 1）正向最大匹配法（由左到右的方向）；</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 2）逆向最大匹配法（由右到左的方向）；</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 3）最少切分（使每一句中切出的词数最小）。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 还可以将上述各种方法相互组合，例如，可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点，正向最小匹配和逆向最小匹配一般很少使用。一般说来，逆向匹配的切分精度略高于正向匹配，遇到的歧义现象也较少。统计结果表明，单纯使用正向最大匹配的错误率为1/169，单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统，都是把机械分词作为一种初分手段，还需通过利用各种其它的语言信息来进一步提高切分的准确率。</p>
            <br />
            <p>&nbsp;&nbsp;&nbsp; 一种方法是改进扫描方式，