首页 > 其他 > 详细

博客作业05--查找

时间:2018-05-26 20:49:19      阅读:498      评论:0      收藏:0      [点我收藏+]

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提交记录截图

技术分享图片

博客作业05--查找

原文:https://www.cnblogs.com/chenwenjie/p/9092691.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!