??xml version="1.0" encoding="utf-8" standalone="yes"?> 可能会要求输入密码:secret Q配|文仉写的q个密码Q?/p>
d条目成功后,会有提示Q?adding new entry cn=Manager,dc=example,dc=com LDAP学习 entry(record,directory object) 条目 一条数?相当于数据表的一条记?/p>
entrypq个attributel成Qobjectclass是必ȝattributeQ用于描qentry的schema attribute是name/value对Ş式,例如cn = liuxuanyu cn = mengke 一个name 可以对应多个?/p>
container是一U特D的entry,为数据的l织和管理提供一个承体pȝ?例如ou 与关pL据库的比较: LDAP只允许树形结?/p>
object identifier (OID) 例如Q?.5.4.3 它是属性类型的标识W?/p>
schema 构造schema的方?Q?br />
1. l合现有的object class The subschema publishes the schema to clients inetOrgPerson is a contemporary definition for a person entry RFC 2798 NDS是遵守LDAP协议的ƈq行了扩展的cMAD产品。而NOVEL也已把JLDAP捐献l了OPENLDAP开源项目,可以世界范围内自׃用。与 JNDI相比QJLDAP无须l承DirContext才能实现dQ也无需预先生成d的类Q可以象普通数据访问那P生成q接Q然后?:addҎd。这Pd的灵zL要ZJNDI?br />
OpenLDAP下蝲地址Q?a >http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe 下蝲后点d装即可?br />
配置sldap.conf Q在安装目录下找到sldap.conf Q修攚w|如下:
suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
rootpw secret
启动OpenLDAPQ进入cmd命o行,跌{到OpenLDAP安装目录下,q行Q?br />
slapd -d 1
再开一个cmdQ蟩转到OpenLDAP安装目录下?br />
试OpenLDAP是否正常启动Q?br />
ldapsearch -x -s base (objectclass=*) namingContexts
使用引号?br />
如果q回Q?br />
dn:
namingContexts: dc=example,dc=com
增加一个条目:
1.做一个LDIF文g
2.使用ldapadd命o
1.在安装目录下Q新建文件example.ldifQ输入如下内容:
dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: Example Company
dc: example
dn: cn=Manager,dc=example,dc=com
objectclass: organizationalRole
cn: Manager
2.cmd在安装目录下Q运行:
ldapadd -x -D cn=Manager,dc=example,dc=com -W -f example.ldif
单查询:
ldapsearch -x -b dc=example,dc=com (objectclass=*)
查询成功后,会返回刚才插入的条目?br />
JNDIq接OpenLDAP
Java的JNDI接口很强大,可以q接LDAP服务?br />
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class TestOpenLDAP {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestOpenLDAP LDAPTest1 = new TestOpenLDAP();
String root = "dc=example,dc=com"; //root
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
env.put(Context.PROVIDER_URL, "ldap://localhost/" + root);
env.put(Context.SECURITY_AUTHENTICATION, "simple" );
env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=example,dc=com" );
env.put(Context.SECURITY_CREDENTIALS, "secret" );
DirContext ctx = null ;
try {
ctx = new InitialDirContext(env);
System.out.println( "认证成功" );
}
catch (javax.naming.AuthenticationException e) {
e.printStackTrace();
System.out.println( "认证p|" );
}
catch (Exception e) {
System.out.println( "认证出错Q?/span>" );
e.printStackTrace();
}if (ctx != null ) {
try {
ctx.close();
}
catch (NamingException e) {
//ignore
}
}
}
}
问题Q?br />
1. 囑Ş化界面LDAPBrowser的配|?br />
下蝲地址Q?nbsp;http://files.blogjava.net/Unmi/LdapBrowser282.rar
解压后进入LdapBrowser282目录Q打开配置文gOpenLdap_Localhost.cfg
修改配置Q?br />
basedn=dc=example,dc=com
managerdn=cn=Manager,dc=example,dc=com
2. OpenLDAP的语法,内置ObjectClass
Mentry都可以在特定的情况下变成container
LDAPL作性能?写操作性能不如DB,DB d均可Q读操作性能不如LDAP
数据l构不同
LDAP适合于存储承结构的数据
namespace
DN (distinguish name) DN是entry的名字,entry的唯一标识
RDN (relative distinguish name) entry在某个容器范围内的标?br />
CN (common name) 常用名称 习惯上被用作RDN
DC (domain component) 域名
object class 定义了entry的类?br />
有三U类型的object Class: 抽象cR辅助类和结构化cR?/p>
2. 扩展现有的object class l承 使用辅助c(实际上是一U聚合关p)
3. JLDAP与JNDI的比?br />
JLDAP是由novel开发的Q原是针对Novel的NDS目录设计的JAVA讉K工具。NOVEL的NDS和网景(NETSCAPEQ的目录是工L最早的目录产品。JLDAPqJNDI的服务供应者,而是同一抽象层次下的讉K工具集。与JNDI-LDAP相比QJLDAP更接q于cdpL据库的访问方式?
但由于JLDAP目前是访问NDSQ因此,它不具备JNDI完全面向对象存储的能力,对于高的LDAP应用QJLDAP不是合适的选择?/p>
4. OpenLDAP的深入管?
2.1?位二q制C1的个?br />
解法1Q直观法Q每ơ除?Q计余Cؓ1的个?O(log2v)
解法2Q简单位操作Q每ơ与0x01做与q算Q再右移一位。O(log2v)
解法3Q用位操作v & (v-1) , 每次可减二q制数字中的一?。(若v & (v-1) == 0, 则v?的方q)
解法4Q空间换旉Q利用题目中字长8位的破熾Q徏立一个穷举数l。O(1)
知识点:位运的性质
附:数组?n+1个数Q其中n个数成对出现Q找出非成对出现的那个数?br />
数组所有元素做异或操作?/span>
2.2
1.N!的末有多少个零
2.N!二进制表CZ最低位1的位|?/span>
1.解法Q质因数分解可知Q?只有2*5可得Q所?的个数就是质因数分解?的个C5的个数的最|实际上就?br />
?的个数Z?br />
Z= [N/5] + [N/5^2] +QN/5^3Q? ……
[N/5]表示不大于N的数?的倍数贡献一?
[N/5^2]表示不大于N的数?^2再A献一?/?/span>
2.解法Q因因数分解中只?是偶敎ͼ所以Z = [N/2] + [N/2^2] + [N/2^3] + …… +
2.3L多数元素问题
解法Q减治:每次删除两个不同的ID,水王ID出现的次C旧会过L的一半?/span>
2.4?到N的所有数?#8220;1”出现的个?br /> 解法Q寻?出现的规律,比较复杂?/span>
2.5LN个整C最大的K个数
解法1Q选择排序Q选出最大的K个数?O(n*k)
一Ҏq:部分堆排序,先徏堆,再排出最大的k个数卛_。O(n)+O(logn*k)
解法2Q分治,利用快速排序的划分思\。O(n*log2k)
解法3Q二分搜索(与《编E珠玑》第二章问题A思\cMQ,有两U划分方式:
1.讑ַ知N个数中最值VminQ最大值VmaxQ对区间[Vmin, Vmax]做二分即可?br />
2.设N个整数是M位长的。从最高位开始,按bi??二分?br />
此解法适用于大数据量的处理Q不q要多次d若干个时文件?br />
解法4Q徏一个最堆存储K个数Q堆ؓ堆中最倹{?br />
对第k到N个数Q若A[i]大于堆顶H[0]QoH[0]=A[i]Q再调用shift-downq程调整堆?br />
此解法非帔R合于N值很大的情况Q复杂度为O(n * log2k)
解法5Q空间换旉Q用count[Vmax]计算每个数字出现的次数?br />
如果Vmax很大Q将[0, Vmax]分成m个小块,再分别讨论即可?
2.7最大公U数问题
用位q算求解
位运问题:
1.求一个整数的二进制表CZ1的个?br />
2.逆{一个整数的二进制表C问?/span>
2.9斐L那契数列
·递归 效率最?br />
·q代 O(n)
·矩阵分治?
2.14子数l之和的最大?
分治
动态规?/span>
2.15子矩阵之和的最大?br /> 固定一l_另一l{化ؓ子数l之和的最大值问?/span>
2.16求数l中最镉K增字符列的长度
解法1Q动态规?/p>
假设array[]的前i个元素中Q最镉K增子序列的长度为LIS[i]Q?/p>
则,LIS[i + Q] = max{1, LIS[k]+1}, array[i+1] > array[k], for any k<=i
O(N^2)的时间复杂度
解法2Q?/p>
MLIS[i]定义为前i个元素中Q以array[i]为最大元素的最镉K增子序列的长度?/p>
可以证明QMLIS[i]的最大g是最l的l果?/p>
MaxV[i]保存长度为i的递增子序列最大元素的最倹{?/p>
解法2的程序更新MaxV的部分应该是有问题的Q由此导致时间复杂度的分析错误,q且解法3也是错误的?/p>
2.17数组循环UM
数组问题思\Q?/p>
排序思\
动态规?/p>
看成一个数列或向量
2.18数组分割
3.1字符串移位包含的问题
l定两个字符串s1和s2Q要求判定s2能否被s1做@环移位得到的字符串包含。例如:s1 = AABCD , s2 = CDAAQ返回true. l定s1 = ABCD ?s2 = ACBDQ返回false.
解法1Q模拟字W串UM的过E,判断是否包含子串
解法2Q判断s2是否为s1s1的子串即可?/p>
解法3Q不甌I间Q模拟判断s2是否为s1s1子串的过E?/p>
思\Q字W串可以抽象成向量来考虑?/p>
3.2电话L对应p单词
cM于求q集问题
解法1QP代,用while循环模拟
解法2Q递归
3.3计算字符串相似度
递归求解
char[] strB, int pBBegin, int pBEnd) {
if (pABegin > pAEnd) {
if (pBBegin > pBEnd) {
return 0;
} else {
return pBEnd - pBBegin + 1;
}
}
if (pBBegin > pBEnd) {
if (pABegin > pAEnd) {
return 0;
} else {
return pAEnd - pABegin + 1;
}
}
if (strA[pABegin] == strB[pBBegin]) {
return calStrDis(strA, pABegin + 1, pAEnd, strB,
pBBegin + 1, pBEnd);
} else {
int t1 = calStrDis(strA, pABegin, pAEnd, strB, pBBegin + 1,
pBEnd);
int t2 = calStrDis(strA, pABegin + 1, pAEnd, strB, pBBegin ,
pBEnd);
int t3 = calStrDis(strA, pABegin + 1, pAEnd, strB, pBBegin + 1 ,
pBEnd);
return min(t1, t2, t3) + 1;
}
}
3.4从无头链表中删除节点
q个问题很无?/span>
3.5最短摘要生?br /> 有空再看
3.6~程判断两个链表是否怺
转化成链表是否有环的问题
3.7队列中取最大值操?br /> 可分解ؓ两个子问?br /> 子问?Q设计一个堆栈,使入栈,出栈Q取最大值的旉复杂度都是O(1)?br /> 思\Q用I间换时_加一个数llink2NextMaxItem[]Qlink2NextMaxItem[i]存储的是前i个元素中最大值的下标?/span>
子问?Q用上述Ҏ的两个堆栈实现一个队?br /> 堆栈A负责入队Q堆栈B负责出队。当堆栈BI的时候,堆栈A中的数据全部弹出q压入堆栈B
3.8 求二叉树l点之间的最大距?br /> 动态规划实玎ͼq是不太懂?/span>
3.9重徏二叉?br /> 递归求解
3.10分层遍历二叉?br /> 队列遍历二叉?变量标记层次
3.11E序攚w
~写正确的二分搜索程?br />
C代码Q?br />
Java代码Q?/span>
4.8三角形测试用?br />
试用例的三U类型:
正常输入 覆盖功能?br />
非法输入 值域错误 cd错误
边界D?0 1 MAX MIN