博客作业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  阅读(148)  评论(0编辑  收藏  举报

导航