博客作业05--查找

1.学习总结(2分)

1.1查找的思维导图

1.2 查找学习体会

查找是非常有用一个概念,几乎每一种结构都会用到查找。线性表的查找有顺序查找,折半查找,分块查找,树表的查找有二叉排序树,平衡二叉树,B+树,B-树,还有哈希表查找等。我们通常使用AST来检验一个查找算法的效率。要熟练掌握有关知识并熟悉算法,插入,删除等。查找可以运用于许多情况下,并解决许多的问题。
当然我们也可以使用STL容器中查找,利用map可以使许多复杂的代码简单化使用起来很方便。

2.PTA实验作业(4分)

本周要求挑选出3道题目书写设计思路、调试过程。设计思路使用伪代码描述。题目选做要求:

不能选6-1,6-4
具体书写内容及格式如下:

2.1 题目1:6-2 是否二叉搜索树

2.1.1 设计思路(伪代码或流程图)

if(二叉搜索树为空或只有根节点) 二叉搜索树成立
if(二叉树左节点不为空,将其根节点和他右子树最大的那个节点比较,
  if(是根节点大)则返回TRUE,否则是false;
if(二叉树右节点不为空,将其根节点和他左子树最小的那个节点比较,
  if(是根节点小)则返回TRUE,否则是false;
用递归遍历下面的节点在分别判断其左右是否为二叉搜索树。

2.1.2代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

2.1.3 PTA提交列表说明。


开始的时候总是左右二叉搜索树判断错误,后来发现我是直接把树根的左右节点忽略了,导致无法判断出结果,所以将while()循环改为从根节点左右开始即可。

2.2题目:6-3 二叉搜索树中的最近公共祖先

2.2.1设计思路(伪代码或流程图)

int LCA( Tree T,  int u, int v ){
	if(树为空){返回ERROR
	定义树指针p指向建好的树;p=T;
	定义x=0,flag=0;用来判断是否存在所需节点
        运用while来判断在树中是否有所需的两节点
        如果没有其中任何一个就返回ERROR
        if(又出现v是u的祖先,或者u是v的祖先)返回该节点,此节点即为所求最近的公共祖先  
        if((如果出现v,u在根节点两边),返回该节点,此节点即为所求最近的公共祖先  
        if(任意选一个节点,如选用u,如果u比T->Key大),则其不是最近祖先,则使用递归 找根节点右边的 LCA(T->Right,u,v);
        if(任意选一个节点,如选用u,如果u比T->Key小),则其不是最近祖先,则使用递归 找根节点左边的 LCA(T->Left,u,v); 

2.2.2代码截图


2.2.3 PTA提交列表说明。


本题基本没遇到什么问题,只是在思考如何找出最近的公共祖先是有些点没有想明白,比如根结底即为根的情况,v节点是u节点祖先这些情况。
了解这些情况之后,代码就很好写了

2.3题目:7-1 QQ帐户的申请与登陆

2.3.1设计思路(伪代码或流程图)

利用map函数,定义两个map函数
map<string,int>QQ;  
map<string,string>mark;  
int main()  
{  
    定义整数n,i;  并定义字符串x,y,z;  
    cin>>n;  
    for(i=0 to n;i++)
        cin>>x>>y>>z;  
        if(x=="L")  
        {  
            if(QQ[y]这个地址值为0){输出"ERROR: Not Exist"
                否则
                if(mark[y]若显示的字符串不为输入的Z){输出"ERROR: Wrong PW"
                else {
                	输出("Login: OK");  
        }  
      如果x==N
        {  
         判断是否有此账号,若有输出"ERROR: Exist"
           如果没有,则让 QQ[y]=1; mark[y]=z;并输出"New: OK"
end if

2.3.2代码截图

2.3.3 PTA提交列表说明。


本题出现判断地址时了解其是新旧方面出现了问题,主要是QQ号码申请时没有将map中的值改变,导致判断方面出现了错误

3.截图本周题目集的PTA最后排名(3分)

3.1 PTA排名(截图带自己名字的排名)

3.2 我的总分:145

4. 阅读代码(必做,1分)

public class HashSearch {  
  
    public static void main(String[] args) {  
        //“除法取余法”  
        int hashLength = 13;  
  
        int [] array  = { 13, 29, 27, 28, 26, 30, 38 };  
  
        //哈希表长度  
        int[] hash = new int[hashLength];  
        //创建hash  
        for (int i = 0; i < array.length; i++)  
        {  
            insertHash(hash, hashLength, array[i]);  
        }  
          
        int result = searchHash(hash,hashLength, 29);  
  
        if (result != -1)  
            System.out.println("已经在数组中找到,索引位置为:" + result);  
        else  
            System.out.println("没有此原始");  
    }  
  
    /**** 
     * Hash表检索数据 
     *  
     * @param hash 
     * @param hashLength 
     * @param key 
     * @return 
     */  
    public static int searchHash(int[] hash, int hashLength, int key) {  
        // 哈希函数  
        int hashAddress = key % hashLength;  
  
        // 指定hashAdrress对应值存在但不是关键值,则用开放寻址法解决  
        while (hash[hashAddress] != 0 && hash[hashAddress] != key) {  
            hashAddress = (++hashAddress) % hashLength;  
        }  
  
        // 查找到了开放单元,表示查找失败  
        if (hash[hashAddress] == 0)  
            return -1;  
        return hashAddress;  
  
    }  
  
    /*** 
     * 数据插入Hash表 
     *  
     * @param hash 哈希表 
     * @param hashLength 
     * @param data 
     */  
    public static void insertHash(int[] hash, int hashLength, int data) {  
        // 哈希函数  
        int hashAddress = data % hashLength;  
  
        // 如果key存在,则说明已经被别人占用,此时必须解决冲突  
        while (hash[hashAddress] != 0) {  
            // 用开放寻址法找到  
            hashAddress = (++hashAddress) % hashLength;  
        }  
        // 将data存入字典中  
        hash[hashAddress] = data;  
    }  
} 

此代码给我们一些哈希表建立和查找的方法,比如通过取余来找到所寻找的数值,或用数组来判断是否某个地址有这样的一个值,也可以看作是哈希表通过利用map函数来实现查找。

posted @ 2018-05-26 22:00  烦呢,还要起名字  阅读(140)  评论(2编辑  收藏  举报