博客作业05--查找
1.学习总结(2分)
1.1查找的思维导图
1.2 查找学习体会
本章学习了部分查找方法,各种查找方法间的时间复杂度,ASL都不同,可以根据需求来选择查找方法,
其中较难的我认为是B B+树,还不太熟练,
同时,还学会了哈希函数以及map,其中map可以简便的解决很多问题。
2.PTA实验作业(4分)
2.1 题目1:6-2 是否二叉搜索树
2.2 设计思路(伪代码或流程图)
定义函数FindMin查找树中的最小值
定义函数FindMax查找树中的最大值
定义函数IsBST判断是否为二叉搜索树
bool IsBST ( BinTree T )
若该节点为空
则返回true
否则
利用递归访问左右结点并且判断该节点的左右结点是否都返回true
若否
则返回false
若是
判断该节点的值是否大于左边的最大值且小于右边的最小值
若是
则返回true
否则
返回false
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
误将‘大于左边的最大值且小于右边的最小值‘判断成’大于左节点的值小于右节点的值‘导致答案错误,设置了查找最大最小的函数后解决该问题。
2.5 题目2: 6-3 二叉搜索树中的最近公共祖先
2.6 设计思路(伪代码或流程图)
定义函数judge判断该数字是否在该树中
定义函数LCA寻找二叉搜索树中的最近公共祖先
int LCA( Tree T, int u, int v )
若其中一个数字不在树中,返回ERROR
若该节点的值等于或在两个数之间,返回该节点
若该节点的值小于两个数,则递归访问该节点的右孩子
若该节点的值大于两个数,则递归访问该节点的左孩子
2.7 代码截图
2.8 PTA提交列表说明。
少判断了两结点之一是答案的情况,用if添加条件解决问题
2.9 题目3:7-2 航空公司VIP客户查询
2.10
定义id代表身份证号码,k为最低里程,K为实际里程,n为用户数量
应用map函数将id 与 K 关联
map<string,int>a;
for i = 0 to n
输入id和里程
若实际里程小于k
则将实际里程按最低里程计算
累计各个用户的里程
end for
for i = 0 to n
若 a[id] = 0代表该用户没有登记,输出提示
否则输出a[id]即该用户的里程
end for
2.11 代码截图
2.12 PTA提交列表说明
部分正确是因为1 2测试点运行超时,将原本的c++语言改为c语言得以解决
3.截图本周题目集的PTA最后排名(3分)
3.1 PTA排名
3.2 我的总分:145
4. 阅读代码(必做,1分)
/*采用数组实现哈希表*/
#include<stdio.h>
#define DataType int
#define Len 10
typedef struct HashNode
{
DataType data; //存储值
int isNull; //标志该位置是否已被填充
}HashTable;
HashTable hashTable[Len];
void initHashTable() //对hash表进行初始化
{
int i;
for(i = 0; i<Len; i++)
{
hashTable[i].isNull = 1; //初始状态为空
}
}
int getHashAddress(DataType key) //Hash函数
{
return key * 3 % 7;
}
int insert(DataType key)
{
int address = getHashAddress(key);
if(hashTable[address].isNull == 1) //没有发生冲突
{
hashTable[address].data = key;
hashTable[address].isNull = 0;
}
else //当发生冲突的时候
{
while(hashTable[address].isNull == 0 && address<Len)
{
address++; //采用线性探测法,步长为1
}
if(address == Len) //Hash表发生溢出
return -1;
hashTable[address].data = key;
hashTable[address].isNull = 0;
}
return 0;
}
int find(DataType key)
{
int address = getHashAddress(key);
while( !(hashTable[address].isNull == 0 && hashTable[address].data == key && address<Len))
{
address++;
}
if( address == Len)
{
address = -1;
}
return address;
}
int main(int argc, char *argv[])
{
int key[]={7,8,30,11,18,9,14};
int i;
initHashTable();
for(i = 0; i<7; i++)
{
insert(key[i]);
}
for(i = 0; i<7; i++)
{
int address;
address = find(key[i]);
printf("key:%d\t address:%d\n", key[i],address);
}
return 0;
}
该代码为哈希表的实现代码,运用了线性探测法来解决冲突,哈希表长度为len在头部有进行定义,代码工整且都有注释。
5. 代码Git提交记录截图
posted on 2018-05-26 20:36 FaceTheWind 阅读(152) 评论(0) 编辑 收藏 举报