DS博客作业07--查找

1.本周学习总结

1.1思维导图

1476554-20190617085644954-132376084.png

1.2.对图的认识及学习体会

  本章学习了多种查找方法,各有优缺点,有其不同的使用情况。上课时一种一种查找的方法讲过去,是能够听懂,但是课后忘得很快,而且对于个人而言,各类查找得分门别类的记忆很有难度,我并不能将它们很好的区分开来。这就对于做题目时,就需要再次回顾相关内容。

2.PTA实验作业

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

2.1.1设计思路

bool IsBST ( BinTree T )
{
    if树存在 
    {
        递归左子树T->Left
        结点值存入数组a
        递归右子树T->Right
    }
    for(j=1 to i) 
    {
        if(a[j-1]>=a[j])
        返回错误 
    }
    返回正确
} 

2.1.2代码截图

1476554-20190617090830465-1623960762.png

2.1.3本题PTA提交列表说明。

1476554-20190617091236447-1937581848.png

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

2.2.1设计思路

int find(Tree T,int u){
    空树返回0
    找到返回1
    在左子树上
    return find(T->Left,number);
        在右子树上
    return find(T->Right,number);
}

int LCA(Tree T, int u, int v) {
     T为空树 返回ERROR
     if  u,v都在左子树上;return LCA(T->Right,u,v);
     if  u,v都在右子树上;return LCA(T->Left,u,v);
     if u,v一个在左子树上,一个在右子树上;return T->Key;
     if u,v有一个在根上。 return T->Key;
}

2.2.2代码截图

1476554-20190617092145992-1085171790.png

2.2.3本题PTA提交列表说明。

1476554-20190617095326898-645219029.png

2.3.题目3:6-4 jmu-ds-哈希表操作集

2.3.1设计思路

//哈希表插入数据,n表示哈希表数据个数,k插入关键字,p除数
void InsertHT(HashTable ha,int &n,KeyType k,int p)
{
    int i,adr;
    adr=k%p(哈希函数);
    if(直接找到)
    {
        ha[adr].key=k;
        ha[adr].count=1;
    }
    else
    {
        i=1;
        线性探测法,不断向后找 
        {
            adr=(adr+1)%p;
            i++;
        }
        ha[adr].key=k;
        ha[adr].count=i; 
    } 
    n++;
} 

//创建哈希表,x为输入数组,n输入数据个数,m为哈希表长度,这里假设m=p
void CreateHT(HashTable ha,KeyType x[],int n,int m,int p)
{
    n1=n;将n的值保存下来 
    int i;
    for(i=0 to m)
    {
        关键key置为-1;
        探测次数count置为0;
    }
    引用型n置为0;
    for(i=0 to n1)
        将值插入 
}

//在哈希表中查找关键字k,找不到返回-1,找到返回查找地址。
int SearchHT(HashTable ha,int p,KeyType k)
{
    int i=1,adr;
    adr=k%p;
    while(未找到,则符合线性探测,往后找)
    {
        i++;
        adr=(adr+1)%p;
    }
    未找到的次数也是i;
    if(ha[adr].key==k)
    return adr;
    else
    return -1;
}

2.3.2代码截图

1476554-20190617095546177-1764298419.png
1476554-20190617095609804-61367424.png
1476554-20190617095630485-2098226033.png

2.3.3本题PTA提交列表说明。

1476554-20190617100702734-2067656130.png

3、阅读代码

3.1题目

  给定一个含n个元素的数组,在数组中查找两个元素,这两个元素的和等于给定的元素K

3.2解决思路

 * 1.先将数组排序
 * 2.设置索引low=0,high=n-1,并计算sum=A[low]+A[high]
 * 3.如果sum==k,则直接输出当前元素对的索引
 * 4.如果sum>k,则high减一
 * 5.如果sum<k,则low加一

3.3 代码截图

1476554-20190617102347283-900965751.png

3.4 学习体会

  第一步将数组排序,运用了STL容器,非常简便,直接省去了一大段代码;而最前和最后的元素开始比较的这个想法也是很巧妙,再进行于关键词的比较,如果大于关键词,就将最大元素位置减1,否则将最小的元素加1.如此循环,便可以找出想要查找的两个元素。

转载于:https://www.cnblogs.com/lxldbk/p/11029209.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值