DS博客作业07--查找

1.本周学习总结#

1.思维导图##

2.谈谈你对查找运算的认识及学习体会。##

查找这部分内容二叉排序树较为重要,二叉排序树有一个很重要的特点就是它的中序遍历序列是一个递增序列,二叉排序树很大程度上提高了查找效率。还有要掌握如何计算ASL成功和ASL不成功的方法,进行二叉排序树结点的删除要掌握它的删除规则。还有平衡二叉树的插入结点难度会比较大,要孰知四种类型是怎么进行调整的,结点的删除也要考虑进行调整。
B树的插入、删除,哈希表的查找,解决哈希冲突的方法,线性探测法、拉链法,计算ASL也都是本章的重点。
本章的理论知识较多,要掌握这些操作方法,学会计算ASL,多练习树结点的插入、删除。

2.PTA实验作业#

2.1.题目1:是否二叉搜索树##

2.1.1设计思路(伪代码)###

在函数外先定义一个数组
定义i
bool IsBST ( BinTree T )
{
        if(树不空)
              中序遍历把结点存到a数组中
        遍历数组a
               if(a[j-1]>=a[j])
                    return 0; 
        return 1;
}

2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)###

2.1.3本题PTA提交列表说明。###

Q1:都是部分正确
A1:判断是否二叉搜索树,可以根据它中序遍历得到的序列是递增序列这个性质,进行判断。部分正确是因为我一开始把i=0定义在函数内,这样每次调用函数,i的值都只会从0开始,数组里面也只有一个数。所以不是二叉搜索树的也会输出Yes,造成部分正确。i=0应该定义在函数外,就能保证把中序遍历的序列存到数组中。

2.2.题目2:哈希表操作集##

2.2.1设计思路(伪代码)###

void InsertHT(HashTable ha,int &n,KeyType k,int p)
{
	int i,adr;
	adr=k%p;
        if(数组ha[adr]是空的)
	{
                把k放到数组ha[adr]中
		k的探测次数置为1
	}
	else
	{
		i=1;
        do
		{
			adr=(adr+1)%p;
			i++;
		}while(ha[adr]不为空);
		把k放到数组ha[adr]中
		k的探测次数置为i
	}
	哈希表数据个数n++
}
void CreateHT(HashTable ha,KeyType x[],int n,int m,int p)  
{
	int i,j=n;
	 遍历哈希表
             给ha[i].key、ha[i].count置初值
	n=0;
	for(i=0;i<j;i++)
	    调用InsertHT函数,把x[i]插入哈希表中   
}
int SearchHT(HashTable ha,int p,KeyType k)
{
	int i=1,adr,j;
	adr=k%p;
        while(ha[adr]是空的且ha[adr]不等于k)
        {
             i++
             线性探测adr=(adr+1)%p
        }
	if(ha[adr].key==k)
	    return adr;
	else
	{
		uns_count=i;
		return -1;
	}
}

2.2.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)###


2.2.3本题PTA提交列表说明。###

Q1:还是部分正确问题
A1:这题是按书上代码写的,有一些细节做了改变,函数的参数和书上不完全相同。处理探测失败的情况时,没看清楚题目,直接return -1,没有把探测次数赋值给uns_count。改完以后,发现还是部分正确,探测失败的还是答案错误。觉得挺奇怪的,明明按书上的思路写的。后来把哈希表里的内容输出看了一下,发现里面居然有重复的数据,看来插入的时候出错了。书上用了两个变量来存放输入数据个数、哈希表数据个数,而该题只有一个n。原来把x数组里面的数据插入哈希表时,循环条件为i<n,但n同时又要统计哈希表数据个数,就出错了。所以我用j先保存了初始的n,循环条件改为i<j,就解决了。

2.3.题目3:QQ帐户的申请与登陆##

2.3.1设计思路(伪代码)###

    int n;
    string a,b,c;
    cin>>n;
    while(n--) 
   {
        输入a,b,c
        if(a == "N") 
	{
            if(账号在map容器中找不到) 
	   {
                mp[b]的值置为密码
                输出创建成功
            }
            else 
	        输出账号已经存在
        }
        else 
	{
            if(账号在map容器中找不到) 
                输出账号不存在
            else if(账号密码不等于c) 
                输出密码错误
            else 
                输出登录成功
        }
    }
}

2.3.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)###


2.3.3本题PTA提交列表说明。###

这题用map容器解决会方便许多,也好理解,从这题也了解到了一点map容器的使用。若用常规做法,新申请帐户的情况下,判断该账号是否已经存在,应该会很麻烦。使用了map容器代码量也不多,像查找功能都可以直接使用,不用再自己写代码。

3、阅读代码#

3.1 题目##

峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。


3.2 解题思路##

该题要找峰值元素,而不是最大值,只要找到一个比它前面的数大,也比它后面数大的数就是峰值。但题目要求返回该数的索引,所以找到的数的索引为它后面那个数的索引减1.

3.3 代码截图##

3.4 学习体会##

找峰值和找最大值不同,峰值就是数学上的极大值,只要判断一个数比它前后的数都大即可。判断好该数大于它前面的数后,只要判断该数大于它后面的数就可停止寻找,这题采用的方法是比较容易理解的。
原文地址:https://www.cnblogs.com/x-m-66/p/11031394.html