查找
1.学习总结
1.1查找的思维导图;
1.2 查找学习体会(谈谈你对查找算法学习体会。也可以谈谈STL容器中查找如何用的。)
1. 静态查找包含顺序查找、折半查找,动态查找则有树表查找,哈希表查找,但不管是那种方法,我们追求的是查找的效率,能够在尽可能短的时间内查找到数据。
2.查找在数据结构中占着很重要的地位,几乎每一个结构都要用到查找。查找是十分有用的操作。
3.ASL是衡量一个查找算法效率优劣的标准,ASL=∑ Pi. Ci
4.时间复杂度对于查找代码也很重要。这章所学的查找结构的时间复杂度逐渐降低至O(1)。
5. C++的map、set等头文件十分节省我们的时间,提供了相当好用的工具。
2.PTA实验作业
2.1 题目1:6-2 是否二叉搜索树
2.2 设计思路(伪代码或流程图)
if(T为空树)返回true
else if(左子树不为空但有键值大于其根结点的键值) return false
else if(右子树不为空但有键值小于其根结点的键值) return false
再次返回调用左子树和右子树
2.3 代码截图
2.4 PTA提交列表说明
错误原因:
!!对问题考虑不全面,左右子树都要为二叉搜索树,即它们的先序遍历结果是递增序列,因此可以用数组存放它们的值,
只要遍历数组时发现有前面元素大于后面元素,就可以说明该树不是二叉搜索树
2.1 题目2:6-3 二叉搜索树中的最近公共祖先
2.2 设计思路(伪代码或流程图)
思路如下:
有两种情况:1.u,v不在树中;
2.u,v在树中:<1>u,v都在左子树上;
<2>u,v都在右子树上;
<3>u,v一个在左子树上,一个在右子树上;
<4>u,v有一个在根上。
if(T是空树) 返回error
if(查找不到u,v)返回error
if(u,v有一个是根节点)返回根节点的关键字
if(u,v一个在左子树,一个在右子树)返回根节点的关键字
if(都在右子树)继续调用,节点变成右节点
if(都在左子树)继续调用,节点变成左节点
2.3 代码截图
2.4 PTA提交列表说明
解题体会:起初看到这道题,就感觉没思路,就想搜题解。仔细一想,一直搜题解也不是办法,
自主思考才能更快的提高能力。沉住气看了一会儿,问题就迎刃而解啦。
2.1 题目3:7-1 QQ帐户的申请与登陆
2.2 设计思路(伪代码或流程图)
定义以关键字为string类型,对应类型为string类型的map:mm
while n大于0时: 输入 c 和 num 和 str
若 c 的值是 L :如果 user[num] 为空,则输出 “ERROR: Not Exist” ;
不然:如果 user[num] 对应的内容与 str 相同,输出 "Login: OK" ,否则输出 "ERROR: Wrong PW"
若c值为 N :如果 user[num] 不为空,则输出 "ERROR: Exist" ;
不然:将 user[num] 对应的内容赋值为 str ( string 类型支持),输出 "New: OK"
针对每条指令,给出相应的信息:
1)若新申请帐户成功,则输出“New: OK”;
2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。
2.3 代码截图
2.4 PTA提交列表说明
开始是PTA的编程环境选错了,要选c++环境才能运行,关键字要定义为string类型,对应类型为string类型的map:mm
3.截图本周题目集的PTA最后排名
3.1 PTA排名(截图带自己名字的排名)
3.2 我的总分:2分
6-4 7-3 不会!! 7-2编译错误
4. 阅读代码
哈希表JAVA源码:
哈希表是一种数据结构,提供快速的插入和查找功能。哈希表基于数组存储数据,因此能在O(1)时间内定位数据。关键字值通过哈希函数映射为数组下标。缺点就是数组创建后容量固定,如果数据较多需要不断扩展其长度。
如何将关键字转换为数组下标?这个操作是通过哈希函数完成的。比如,下面就是一个简单的哈希函数,
int hash(int key){
return key % array.length;//通过取余,返回值数组下标
有时候,有些哈希函数对于不同的键值可能会生成相同的哈希码值。所以需要解决冲突问题,下面有两种方法:
1.开放地址法:通过在哈希表中再找一个空位来解决此问题。
此法又分为三种方法:
1)线性探测,即上面使用的这种方法,哈希函数将关键字范围压缩到数组的范围,对数组长度取余即可,+1,+2,+3…以此类推进行取余。
2)二次探测的过程是这样,+1,+2,+4,+9…以此类推。
3)再哈希,用不同的哈希函数对关键字再做一次哈希化。
2.链地址法:在哈希表每个单元中设置链表。某个数据项的关键值仍然映射到哈希表的单元中,而数据项本身插入这个单元的链表中其他同样映射到这个位置的数据项只需要加入到链表中。
package test;
public class HashTable {
Item[] hashArray;
int arraySize;//定义数组长度
public HashTable(int size){//构造器,初始化
arraySize = size;
hashArray = new Item[arraySize];
}
//哈希函数
public int hash(int key){
return key % arraySize;
}
//插入,这里假设是数组未满,即不能插入大于arraySize的数据数
public void insert(Item item){
int key = item.getKey();
int hashCode = hash(key);
//若已存在同样的数据,则向下进一位,直到找到空的位置
//为了简单,也可要求不准有重复数据
while(hashArray[hashCode] != null){
++hashCode;
hashCode %= arraySize;
}
hashArray[hashCode] = item;
}
//删除
public Item delete(int key){
int hashCode = hash(key);
while(hashArray[hashCode] != null){
if(hashArray[hashCode].getKey() == key){
Item temp = hashArray[hashCode];
hashArray[hashCode] = null;
return temp;
}
++hashCode;
hashCode %= arraySize;
}
return null;
}
//查找
public Item find(int key){
int hashCode = hash(key);
while(hashArray[hashCode] != null){
if(hashArray[hashCode].getKey() == key)
return hashArray[hashCode];
++hashCode;
hashCode %= arraySize;
}
return null;
}
//列出全部数据
public void show(){
for(int i=0;i<arraysize;i++){ if(hasharray[i]="" !="null)" system.out.print(hasharray[i].getkey()="" +="" "="" ");="" else="" system.out.print("*="" }="" public="" static="" void="" main(string[]="" args)="" {="" hashtable="" ht="new" hashtable(10);="" ht.insert(new="" item(1));="" item(2));="" item(3));="" item(4));="" ht.show();="" item="" i="ht.find(3);" system.out.println("i="+i.getKey());
Item di = ht.delete(3);
System.out.println(" di="+di.getKey());
ht.show();
}
}
//定义哈希表中存放的数据类型,可以为任意的类型
class Item{
int idata;
public Item(int idata){
this.idata = idata;
}
public int getKey(){
return idata;
}
}</pre><br>
<br>
</p> </div>
</div>
<div id=" pages"="" class="box_body"></arraysize;i++){>