﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-neverend的日志-随笔分类-笔记</title><link>http://www.blogjava.net/neverend/category/46475.html</link><description>不记录，终将被遗忘。
一万年太久，只争朝夕。
他们用数字构建了整个世界。</description><language>zh-cn</language><lastBuildDate>Thu, 11 Oct 2012 13:37:50 GMT</lastBuildDate><pubDate>Thu, 11 Oct 2012 13:37:50 GMT</pubDate><ttl>60</ttl><item><title>Windows下OpenLDAP的安装与配置</title><link>http://www.blogjava.net/neverend/archive/2010/10/08/334014.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Fri, 08 Oct 2010 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2010/10/08/334014.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/334014.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2010/10/08/334014.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/334014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/334014.html</trackback:ping><description><![CDATA[本文主要参考官方文档：http://www.openldap.org/doc/admin24/quickstart.html<br />
和网上流传的教程：<a href="http://www.lifv.cn/?p=462">http://www.lifv.cn/?p=462</a><br />
<br />
OpenLDAP下载地址：<a href="http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe">http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe</a><a href="http://download.bergmans.us/openldap/openldap-2.2.19/openldap-2.2.19-db-4.3.21-openssl-0.9.7e-win32.exe"></a>&nbsp;下载后点击安装即可。<br />
<br />
配置sldap.conf ：在安装目录下找到sldap.conf ，修改配置如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">suffix&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">dc=example,dc=com</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rootdn&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">cn=Manager,dc=example,dc=com</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rootpw&nbsp;secret&nbsp;</span></div>
<br />
启动OpenLDAP：进入cmd命令行，跳转到OpenLDAP安装目录下，运行：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">slapd&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">d&nbsp;</span><span style="color: #000000">1</span></div>
用可以看到控制台下打印一片信息，openldap 默认是用的 Berkeley DB 数据库存储目录数据的。<br />
<br />
再开一个cmd，跳转到OpenLDAP安装目录下。<br />
<br />
测试OpenLDAP是否正常启动：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">ldapsearch&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">x&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">s&nbsp;base&nbsp;(objectclass</span><span style="color: #000000">=*</span><span style="color: #000000">)&nbsp;namingContexts</span></div>
官方文档里，这一条命令加了些单引号，但带单引号的命令在Windows环境下跑不通。后面的命令也都避免<br />
使用引号。<br />
如果返回：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">dn:&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />namingContexts:&nbsp;dc</span><span style="color: #000000">=</span><span style="color: #000000">example,dc</span><span style="color: #000000">=</span><span style="color: #000000">com</span></div>
则说明OpenLDAP成功启动<br />
<br />
增加一个条目：<br />
1.做一个LDIF文件<br />
2.使用ldapadd命令<br />
<br />
1.在安装目录下，新建文件example.ldif，输入如下内容：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">dn:&nbsp;dc</span><span style="color: #000000">=</span><span style="color: #000000">example,dc</span><span style="color: #000000">=</span><span style="color: #000000">com&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />objectclass:&nbsp;dcObject&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />objectclass:&nbsp;organization&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />o:&nbsp;Example&nbsp;Company&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dc:&nbsp;example&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dn:&nbsp;cn</span><span style="color: #000000">=</span><span style="color: #000000">Manager,dc</span><span style="color: #000000">=</span><span style="color: #000000">example,dc</span><span style="color: #000000">=</span><span style="color: #000000">com&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />objectclass:&nbsp;organizationalRole&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />cn:&nbsp;Manager</span></div>
注意：在文档每一行的开头和结尾不要有空格，文档最后最好也别回车。建议不要拷贝，用手敲这几行。<br />
<br />
2.cmd在安装目录下，运行：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">ldapadd&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">x&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">D&nbsp;cn</span><span style="color: #000000">=</span><span style="color: #000000">Manager,dc</span><span style="color: #000000">=</span><span style="color: #000000">example,dc</span><span style="color: #000000">=</span><span style="color: #000000">com&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">W&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;example.ldif</span></div>
<p>可能会要求输入密码：secret （配置文件里写的这个密码）</p>
添加条目成功后，会有提示： adding new entry cn=Manager,dc=example,dc=com<br />
<br />
简单查询：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">ldapsearch&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">x&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">b&nbsp;dc</span><span style="color: #000000">=</span><span style="color: #000000">example,dc</span><span style="color: #000000">=</span><span style="color: #000000">com&nbsp;(objectclass</span><span style="color: #000000">=*</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
查询成功后，会返回刚才插入的条目。<br />
<br />
JNDI连接OpenLDAP<br />
Java的JNDI接口很强大，可以连接LDAP服务。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Hashtable;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.naming.Context;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.naming.NamingException;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.naming.directory.DirContext;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.naming.directory.InitialDirContext;&nbsp;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestOpenLDAP&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestOpenLDAP&nbsp;LDAPTest1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TestOpenLDAP();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">dc=example,dc=com</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">root</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hashtable&nbsp;env&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Hashtable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.INITIAL_CONTEXT_FACTORY,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">com.sun.jndi.ldap.LdapCtxFactory</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.PROVIDER_URL,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ldap://localhost/</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;root);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.SECURITY_AUTHENTICATION,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">simple</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.SECURITY_PRINCIPAL,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">cn=Manager,dc=example,dc=com</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.SECURITY_CREDENTIALS,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">secret</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DirContext&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InitialDirContext(env);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">认证成功</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(javax.naming.AuthenticationException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">认证失败</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">认证出错：</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ctx&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(NamingException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ignore</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
问题：<br />
1. 图形化界面LDAPBrowser的配置<br />
下载地址：&nbsp;<a href="http://files.blogjava.net/Unmi/LdapBrowser282.rar">http://files.blogjava.net/Unmi/LdapBrowser282.rar</a><br />
解压后进入LdapBrowser282目录，打开配置文件OpenLdap_Localhost.cfg<br />
修改配置：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">basedn</span><span style="color: #000000">=</span><span style="color: #000000">dc</span><span style="color: #000000">=</span><span style="color: #000000">example,dc</span><span style="color: #000000">=</span><span style="color: #000000">com<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />managerdn</span><span style="color: #000000">=</span><span style="color: #000000">cn</span><span style="color: #000000">=</span><span style="color: #000000">Manager,dc</span><span style="color: #000000">=</span><span style="color: #000000">example,dc</span><span style="color: #000000">=</span><span style="color: #000000">com</span></div>
运行lbe.bat进入图形界面后选择连接OpenLdap_Localhost即可。<br />
<br />
2. OpenLDAP的语法，内置ObjectClass<br />
<p>LDAP学习</p>
<p>entry(record,directory object)&nbsp; 条目 一条数据 相当于数据表的一条记录</p>
<p>entry由若干个attribute组成，objectclass是必须的attribute，用于描述entry的schema</p>
<p>attribute是name/value对形式，例如cn = liuxuanyu cn = mengke 一个name 可以对应多个值</p>
<p>container是一种特殊的entry,为数据的组织和管理提供一个继承体系结构,例如ou<br />
任何entry都可以在特定的情况下变成container</p>
<p>与关系数据库的比较：<br />
LDAP读操作性能高,写操作性能不如DB,DB 读写均可，读操作性能不如LDAP<br />
数据结构不同<br />
LDAP适合于存储继承结构的数据</p>
<p><br />
namespace<br />
DN (distinguish name) DN是entry的名字，entry的唯一标识<br />
RDN (relative distinguish name) entry在某个容器范围内的标识<br />
CN (common name) 常用名称 习惯上被用作RDN<br />
DC (domain component) 域名</p>
<p>LDAP只允许树形结构</p>
<p>object identifier (OID) 例如：2.5.4.3 它是属性类型的标识符</p>
<p>schema<br />
object class 定义了entry的类型<br />
有三种类型的object Class: 抽象类、辅助类和结构化类。</p>
<p>构造schema的方式 ：<br />
1. 组合现有的object class<br />
2. 扩展现有的object class 继承 使用辅助类（实际上是一种聚合关系）</p>
<p>The subschema publishes the schema to clients</p>
<p>inetOrgPerson is a contemporary definition for a person entry RFC 2798</p>
<br />
3. JLDAP与JNDI的比较<br />
&nbsp;JLDAP是由novel开发的，原是针对Novel的NDS目录设计的JAVA访问工具。NOVEL的NDS和网景（NETSCAPE）的目录是工具界最早的目录产品。JLDAP并非JNDI的服务供应者，而是同一抽象层次下的访问工具集。与JNDI-LDAP相比，JLDAP更接近于类关系数据库的访问方式。
<p>&nbsp;&nbsp; NDS是遵守LDAP协议的并进行了扩展的类MAD产品。而NOVEL也已把JLDAP捐献给了OPENLDAP开源项目，可以世界范围内自由使用。与 JNDI相比，JLDAP无须继承DirContext才能实现添加，也无需预先生成添加的类，可以象普通数据访问那样，生成连接，然后使用::add方法添加。这样，添加的灵活性要强于JNDI。<br />
<br />
但由于JLDAP目前是访问NDS，因此，它不具备JNDI完全面向对象存储的能力，对于高级的LDAP应用，JLDAP不是合适的选择。</p>
<br />
4. OpenLDAP的深入管理 <br />
<img src ="http://www.blogjava.net/neverend/aggbug/334014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2010-10-08 23:05 <a href="http://www.blogjava.net/neverend/archive/2010/10/08/334014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编程之美》阅读笔记</title><link>http://www.blogjava.net/neverend/archive/2010/09/29/333339.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Wed, 29 Sep 2010 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2010/09/29/333339.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/333339.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2010/09/29/333339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/333339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/333339.html</trackback:ping><description><![CDATA[<p><br />
<span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.1求8位二进制数中1的个数<br />
解法1：直观法，每次除以2，计算余数为1的个数 O(log2v) <br />
解法2：简单位操作，每次与0x01做与运算，再右移一位。O(log2v)<br />
解法3：使用位操作v &amp; (v-1) , 每次可减少二进制数字中的一个1。（若v &amp; (v-1) == 0, 则v为2的方幂） <br />
解法4：空间换时间，利用题目中字长8位的破绽，建立一个穷举数组。O(1)</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">知识点：位运算的性质<br />
附：数组有2n+1个数，其中n个数成对出现，找出非成对出现的那个数。<br />
数组所有元素做异或操作。</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.2 <br />
1.N!的末尾有多少个零<br />
2.N!二进制表示中最低位1的位置</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">1.解法：质因数分解可知，0只有2*5可得，所以0的个数就是质因数分解中2的个数与5的个数的最小值，实际上就是<br />
求5的个数Z。<br />
Z= [N/5] +　[N/5^2] +［N/5^3］+ &#8230;&#8230; <br />
[N/5]表示不大于N的数中5的倍数贡献一个5 <br />
[N/5^2]表示不大于N的数中5^2再贡献一个5/。</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.解法：因为质因数分解中只有2是偶数，所以Z = [N/2] + [N/2^2] + [N/2^3] + &#8230;&#8230; +</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.3寻找多数元素问题<br />
解法：减治：每次删除两个不同的ID,水王ID出现的次数仍旧会超过总数的一半。</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.4从1到N的所有数中&#8220;1&#8221;出现的个数<br />
解法：寻找1出现的规律，比较复杂。</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.5寻找N个整数中最大的K个数<br />
解法1：选择排序，选出最大的K个数。 O(n*k)<br />
&nbsp;一点改进：部分堆排序，先建堆，再排出最大的k个数即可。O(n)+O(logn*k)<br />
解法2：分治，利用快速排序的划分思路。O(n*log2k)<br />
解法3：二分搜索（与《编程珠玑》第二章问题A思路类似），有两种划分方式：<br />
1.设已知N个数中最小值Vmin，最大值Vmax，对区间[Vmin, Vmax]做二分即可。<br />
2.设N个整数是M位长的。从最高位开始，按bi位0、1二分。<br />
此解法适用于大数据量的处理，不过要多次读写若干个临时文件。<br />
解法4：建一个最小堆存储K个数，堆顶为堆中最小值。<br />
对第k到N个数，若A[i]大于堆顶H[0]，令H[0]=A[i]，再调用shift-down过程调整堆。<br />
此解法非常适合于N值很大的情况，复杂度为O(n * log2k)<br />
解法5：空间换时间，用count[Vmax]计算每个数字出现的次数。<br />
如果Vmax很大，将[0, Vmax]分成m个小块，再分别讨论即可。 </span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.7最大公约数问题<br />
&nbsp;用位运算求解<br />
&nbsp;&nbsp; 位运算问题： <br />
&nbsp;&nbsp; 1.求一个整数的二进制表示中1的个数<br />
&nbsp;&nbsp; 2.逆转一个整数的二进制表示问题</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.9斐波那契数列<br />
&#183;递归 效率最低<br />
&#183;迭代 O(n)<br />
&#183;矩阵分治法 </span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.14子数组之和的最大值 <br />
分治 <br />
动态规划</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">2.15子矩阵之和的最大值<br />
固定一维，另一维转化为子数组之和的最大值问题</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">
</span></span></span></p>
<p>2.16求数组中最长递增字符列的长度</p>
<p>解法1：动态规划</p>
<p>假设array[]的前i个元素中，最长递增子序列的长度为LIS[i]，</p>
<p>则，LIS[i + １] = max{1, LIS[k]+1}, array[i+1] &gt; array[k], for any k&lt;=i</p>
<p>
</p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;LIS(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">[]&nbsp;array)&nbsp;{<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">[]&nbsp;LIS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">[array.length];<br />
</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;array.length;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;LIS[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">i;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(array[i]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;array[j]&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;LIS[j]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">LIS[i])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIS[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;LIS[j]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">　</span><span style="color: #000000; ">１</span><span style="color: #000000; ">;　<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}&nbsp;<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>O(N^2)的时间复杂度</p>
<p>解法2：</p>
<p>MLIS[i]定义为前i个元素中，以array[i]为最大元素的最长递增子序列的长度。</p>
<p>可以证明，MLIS[i]的最大值也是最终的结果。</p>
<p>MaxV[i]保存长度为i的递增子序列最大元素的最小值。</p>
<p>解法2的程序更新MaxV的部分应该是有问题的，由此导致时间复杂度的分析错误，并且解法3也是错误的。</p>
<p><br />
</p>
<p>2.17数组循环移位</p>
<p>
</p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;rightshift(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arr,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;N,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;k)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;K&nbsp;</span><span style="color: #000000; ">%=</span><span style="color: #000000; ">&nbsp;N;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Reverse(arr,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;N</span><span style="color: #000000; ">-</span><span style="color: #000000; ">k</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Reverse(arr,&nbsp;N</span><span style="color: #000000; ">-</span><span style="color: #000000; ">k,&nbsp;N</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Reverse(arr,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;N</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />
}</span></div>
<p>&nbsp;</p>
<p>数组问题思路：</p>
<p>排序思路</p>
<p>动态规划</p>
<p>看成一个数列或向量</p>
<p><br />
</p>
<p>2.18数组分割</p>
<p><br />
</p>
<p>3.1字符串移位包含的问题</p>
<p>给定两个字符串s1和s2，要求判定s2能否被s1做循环移位得到的字符串包含。例如：s1 = AABCD , s2 = CDAA，返回true. 给定s1 = ABCD 和 s2 = ACBD，返回false.</p>
<p>解法1：模拟字符串移位的过程，判断是否包含子串</p>
<p>解法2：判断s2是否为s1s1的子串即可。</p>
<p>解法3：不申请空间，模拟判断s2是否为s1s1子串的过程。</p>
<p>思路：字符串可以抽象成向量来考虑。</p>
<p><br />
</p>
<p>3.2电话号码对应英语单词</p>
<p>类似于求幂集问题</p>
<p>解法1：迭代，用while循环模拟</p>
<p>解法2：递归</p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.3计算字符串相似度<br />
递归求解<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;calStrDis(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">[]&nbsp;strA,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pABegin,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pAEnd,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">[]&nbsp;strB,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pBBegin,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pBEnd)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pABegin&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pAEnd)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pBBegin&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pBEnd)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;pBEnd&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;pBBegin&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pBBegin&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pBEnd)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pABegin&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pAEnd)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;pAEnd&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;pABegin&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(strA[pABegin]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;strB[pBBegin])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;calStrDis(strA,&nbsp;pABegin&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;pAEnd,&nbsp;strB,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBBegin&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;pBEnd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;t1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;calStrDis(strA,&nbsp;pABegin,&nbsp;pAEnd,&nbsp;strB,&nbsp;pBBegin&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBEnd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;t2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;calStrDis(strA,&nbsp;pABegin&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;pAEnd,&nbsp;strB,&nbsp;pBBegin&nbsp;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBEnd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;t3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;calStrDis(strA,&nbsp;pABegin&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;pAEnd,&nbsp;strB,&nbsp;pBBegin&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBEnd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;min(t1,&nbsp;t2,&nbsp;t3)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
递归优化，如何存储子问题的解？</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.4从无头链表中删除节点<br />
这个问题很无耻</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.5最短摘要生成<br />
有空再看</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.6编程判断两个链表是否相交<br />
转化成链表是否有环的问题</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.7队列中取最大值操作<br />
可分解为两个子问题<br />
子问题1：设计一个堆栈，使入栈，出栈，取最大值的时间复杂度都是O(1)。<br />
思路：用空间换时间，加一个数组link2NextMaxItem[]，link2NextMaxItem[i]存储的是前i个元素中最大值的下标。</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">子问题2：用上述特性的两个堆栈实现一个队列<br />
堆栈A负责入队，堆栈B负责出队。当堆栈B空的时候，将堆栈A中的数据全部弹出并压入堆栈B</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.8 求二叉树结点之间的最大距离<br />
动态规划实现，还是不太懂。</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.9重建二叉树<br />
递归求解</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.10分层遍历二叉树<br />
队列遍历二叉树+变量标记层次</span></span></span></p>
<p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.11程序改错<br />
编写正确的二分搜索程序<br />
C代码：<br />
</span></span></span></p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><span style="font-size: 10pt"><img id="Codehighlighter1_46_466_Open_Image" onclick="this.style.display='none'; Codehighlighter1_46_466_Open_Text.style.display='none'; Codehighlighter1_46_466_Closed_Image.style.display='inline'; Codehighlighter1_46_466_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_46_466_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_46_466_Closed_Text.style.display='none'; Codehighlighter1_46_466_Open_Image.style.display='inline'; Codehighlighter1_46_466_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;BinSearch(SeqList&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;R，&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;,&nbsp;KeyType&nbsp;K&nbsp;)</span><span id="Codehighlighter1_46_466_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_46_466_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在有序表R[0..n-1]中进行二分查找，成功时返回结点的位置，失败时返回-1</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span></span><span style="font-size: 10pt"><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;low</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">，high</span><span style="color: #000000">=</span><span style="color: #000000">n</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">，mid；&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">置当前查找区间上、下界的初值</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span></span><span style="font-size: 10pt"><span style="color: #000000">　　</span><span style="color: #0000ff">if</span><span style="color: #000000">(R[low].key</span><span style="color: #000000">==</span></span><span style="font-size: 10pt"><span style="color: #000000">K)<br />
<img id="Codehighlighter1_153_170_Open_Image" onclick="this.style.display='none'; Codehighlighter1_153_170_Open_Text.style.display='none'; Codehighlighter1_153_170_Closed_Image.style.display='inline'; Codehighlighter1_153_170_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_153_170_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_153_170_Closed_Text.style.display='none'; Codehighlighter1_153_170_Open_Image.style.display='inline'; Codehighlighter1_153_170_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span><span id="Codehighlighter1_153_170_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_153_170_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span></span><span style="color: #000000"><span style="font-size: 10pt">&nbsp;;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img id="Codehighlighter1_190_423_Open_Image" onclick="this.style.display='none'; Codehighlighter1_190_423_Open_Text.style.display='none'; Codehighlighter1_190_423_Closed_Image.style.display='inline'; Codehighlighter1_190_423_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_190_423_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_190_423_Closed_Text.style.display='none'; Codehighlighter1_190_423_Open_Image.style.display='inline'; Codehighlighter1_190_423_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span></span><span style="font-size: 10pt"><span style="color: #0000ff">while</span><span style="color: #000000">(low</span><span style="color: #000000">&lt;=</span><span style="color: #000000">high)</span><span id="Codehighlighter1_190_423_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_190_423_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">当前查找区间R[low..high]非空</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span></span><span style="font-size: 10pt"><span style="color: #000000">　　mid</span><span style="color: #000000">=</span><span style="color: #000000">low</span><span style="color: #000000">+</span><span style="color: #000000">((high</span><span style="color: #000000">-</span><span style="color: #000000">low)</span><span style="color: #000000">/</span><span style="color: #000000">2</span><span style="color: #000000">)；</span><span style="color: #008000">//</span><span style="color: #008000">使用&nbsp;(low&nbsp;+&nbsp;high)&nbsp;/&nbsp;2&nbsp;会有整数溢出的问题</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span></span><span style="font-size: 10pt"><span style="color: #000000">　　</span><span style="color: #0000ff">if</span><span style="color: #000000">(R[mid].key</span><span style="color: #000000">==</span></span><span style="font-size: 10pt"><span style="color: #000000">K)<br />
<img id="Codehighlighter1_294_321_Open_Image" onclick="this.style.display='none'; Codehighlighter1_294_321_Open_Text.style.display='none'; Codehighlighter1_294_321_Closed_Image.style.display='inline'; Codehighlighter1_294_321_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_294_321_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_294_321_Closed_Text.style.display='none'; Codehighlighter1_294_321_Open_Image.style.display='inline'; Codehighlighter1_294_321_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span><span id="Codehighlighter1_294_321_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_294_321_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;mid；&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">查找成功返回</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span></span><span style="color: #000000"><span style="font-size: 10pt">　　}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span></span><span style="font-size: 10pt"><span style="color: #0000ff">if</span><span style="color: #000000">(R[mid].key</span><span style="color: #000000">&gt;</span></span><span style="font-size: 10pt"><span style="color: #000000">K)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　high</span><span style="color: #000000">=</span><span style="color: #000000">mid</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">继续在R[low..mid-1]中查找</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span></span><span style="font-size: 10pt"><span style="color: #000000">　　</span><span style="color: #0000ff">else</span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　low</span></span><span style="font-size: 10pt"><span style="color: #000000">=</span><span style="color: #000000">mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">；&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">继续在R[mid+1..high]中查找</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span></span><span style="color: #000000"><span style="font-size: 10pt">　　}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span></span><span style="font-size: 10pt"><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">；&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">当low&gt;high时表示查找区间为空，查找失败</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span></span><span style="color: #000000"><span style="font-size: 10pt">　　}</span></span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">BinSeareh</span></span></div>
<p><br />
<span style="font-size: 10pt">Java代码：</span></p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;binarySearch(</span><span style="color: #0000ff">int</span><span style="color: #000000">[]&nbsp;srcArray,&nbsp;</span><span style="color: #0000ff">int</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;des)<br />
<img id="Codehighlighter1_58_320_Open_Image" onclick="this.style.display='none'; Codehighlighter1_58_320_Open_Text.style.display='none'; Codehighlighter1_58_320_Closed_Image.style.display='inline'; Codehighlighter1_58_320_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_58_320_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_58_320_Closed_Text.style.display='none'; Codehighlighter1_58_320_Open_Image.style.display='inline'; Codehighlighter1_58_320_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />　　</span><span id="Codehighlighter1_58_320_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_58_320_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;low&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;high&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;srcArray.length</span><span style="color: #000000">-</span><span style="color: #000000">1</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
<img id="Codehighlighter1_128_303_Open_Image" onclick="this.style.display='none'; Codehighlighter1_128_303_Open_Text.style.display='none'; Codehighlighter1_128_303_Closed_Image.style.display='inline'; Codehighlighter1_128_303_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_128_303_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_128_303_Closed_Text.style.display='none'; Codehighlighter1_128_303_Open_Image.style.display='inline'; Codehighlighter1_128_303_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span><span style="color: #0000ff">while</span><span style="color: #000000">(low&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;high)&nbsp;</span><span id="Codehighlighter1_128_303_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_128_303_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;middle&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(low&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;high)</span><span style="color: #000000">/</span><span style="color: #000000">2</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
<img id="Codehighlighter1_191_212_Open_Image" onclick="this.style.display='none'; Codehighlighter1_191_212_Open_Text.style.display='none'; Codehighlighter1_191_212_Closed_Image.style.display='inline'; Codehighlighter1_191_212_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_191_212_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_191_212_Closed_Text.style.display='none'; Codehighlighter1_191_212_Open_Image.style.display='inline'; Codehighlighter1_191_212_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span><span style="color: #0000ff">if</span><span style="color: #000000">(des&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;srcArray[middle])&nbsp;</span><span id="Codehighlighter1_191_212_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_191_212_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="font-size: 10pt">&nbsp;middle;<br />
<img id="Codehighlighter1_244_269_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_269_Open_Text.style.display='none'; Codehighlighter1_244_269_Closed_Image.style.display='inline'; Codehighlighter1_244_269_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_244_269_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_244_269_Closed_Text.style.display='none'; Codehighlighter1_244_269_Open_Image.style.display='inline'; Codehighlighter1_244_269_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　}</span></span></span><span style="font-size: 10pt"><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(des&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">srcArray[middle])&nbsp;</span><span id="Codehighlighter1_244_269_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_244_269_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　high&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;middle&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span></span><span style="color: #000000"><span style="font-size: 10pt">;<br />
<img id="Codehighlighter1_275_299_Open_Image" onclick="this.style.display='none'; Codehighlighter1_275_299_Open_Text.style.display='none'; Codehighlighter1_275_299_Closed_Image.style.display='inline'; Codehighlighter1_275_299_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_275_299_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_275_299_Closed_Text.style.display='none'; Codehighlighter1_275_299_Open_Image.style.display='inline'; Codehighlighter1_275_299_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　}</span></span></span><span style="font-size: 10pt"><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_275_299_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_275_299_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　low&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;middle&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span></span><span style="color: #000000"><span style="font-size: 10pt">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span></span><span style="font-size: 10pt"><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span></span><span style="color: #000000"><span style="font-size: 10pt">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />　　}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div>
<p><br />
<span style="font-size: 10pt">4.8三角形测试用例<br />
测试用例的三种类型：<br />
正常输入 覆盖功能点<br />
非法输入 值域错误 类型错误<br />
边界值输入 0 1 MAX MIN&nbsp;</span></p>
<img src ="http://www.blogjava.net/neverend/aggbug/333339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2010-09-29 11:10 <a href="http://www.blogjava.net/neverend/archive/2010/09/29/333339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>