查找

1.学习总结(2分)

1.1查找的思维导图

1.2 查找学习体会

查找这一块学习了线性表的顺序查找,折半查找。树表的平衡二叉树,二叉排序树,B树的查找,以及哈希表的查找。

这块内容的难点主要在于树一块的递归算法,在阅读别人的代码的时候还能比较轻易的理解,但是在自己编写递归算法的时候经常找不到着手点。

关于哈希表还没在实验或者作业中运用,所以这块内容的熟练度和理解程度偏低。

关于线性表是数据结构前半段一直在学习的内容,所以顺序查找和折半查找都有比较熟练的运用

2.PTA实验作业(4分)

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

2.2 设计思路

根据之前所学的二叉树的中序遍历,结合二叉排序树的特性易得中序遍历出来的序列是从小到大依次排序的。因此,这题的思路转变成将二叉树转化为中序遍历得出的序列,再判断序列是否为从小到大依次排序。

伪代码:

int InorderTraversal(BinTree T){
 利用递归算法,中序遍历树种所有的结点,并依次存储到数组a中

利用循环依次判断数组中前一位数是否大于后一位数

若大于,则说明不是二叉排序树,返回0.

反之返回1
}

Bool IsBst(BinTree T)

{

若T是空树

是二叉搜索树

中序遍历

如果后一个值都大于前一个值,返回真,否则假

}

2.3 代码截图

2.4 PTA提交列表说明。

前四次提交中,我采用的是通过递归算法,依次判断树中的左子树和右子树是否满足二叉排序树的规则。

但是,并不是树的左子树和右子树都是二叉排序树就说明该树是二叉排序树。

例如以下情况

可以看到,左树和右树都满足二叉排序树的规则,但是,右树中7小于根节点9,显然不满足二叉排序树的规则。

所以这个思路是有漏洞的。

因此我转变思路,将问题转化为判断中序遍历后的序列是否从小到大排列。

 

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

2.2 设计思路

可分为两种情况:1.u,v不在树中 ,返回error

                   2.u,v在树中u,v都在左子树上

此时又可以分为3种情况(1)u,v都在左子树,为了寻找更近的公共祖先,T->left

           (2)u,v都在右子树上同理

           (3)u,v分别位于左子树和右子树,则说明T->key即为最近的公共祖先

2.3 代码截图

2.4 PTA提交列表说明。

 

2.1 题目3:QQ帐户的申请与登陆

2.2 设计思路

利用Map函数

map<string,int>mp1; 
map<string,string>mp2; 

mp1中的int为0时说明账号未被注册,1的时候说明账号已被注册

伪代码:

int main() 
{  
    输入操作次数n;
    定义串x y z;  
    while(操作次数n--) 
    {  
        输入串x,y,z
        if(x=="N")  /*注册操作*/
        { 
      当mp1[y]==1时,说明账号已经注册,输出ERROR: Exist
            否则
            { 
                将mp1[y]赋值1,说明账号已被注册
                将mp2[y]赋值z,记录账号所对应的密码
               输出NEW:OK
            } 
        }  
        否则为登录操作
        {  
          当mp【y】为0时,说明还未注册 
      输出("ERROR: Not Exist\n");  
            否则
            {  
                mp2【y】不等于z时说明密码不正确 
         输出("ERROR: Wrong PW\n");  
                反之为密码正确 
       输出("Login: OK\n"); 
            } 
        }
    } 

 

2.3 代码截图

2.4 PTA提交列表说明。

前两次错误是采用线性表查找,出现各种错误。

后面自学了map函数,但是输出过程中没有换行,所以格式错误。添加换行符后答案正确

 

3.截图本周题目集的PTA最后排名(3分)

3.1 PTA排名

3.2 我的总分:120分

4. 阅读代码(红黑树)

性质:

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3 每个叶节点(NIL节点,空节点)是黑色的。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
要知道为什么这些特性确保了这个结果,注意到性质4导致了路径不能有两个毗连的红色节点就足够了。最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。因为根据性质5所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。
在很多树数据结构的表示中,一个节点有可能只有一个子节点,而叶子节点不包含数据。用这种范例表示红黑树是可能的,但是这会改变一些属性并使算法复杂。为此,本文中我们使用 "nil 叶子" 或"空(null)叶子",如上图所示,它不包含数据而只充当树在此结束的指示。这些节点在绘图中经常被省略,导致了这些树好象同上述原则相矛盾,而实际上不是这样。与此有关的结论是所有节点都有两个子节点,尽管其中的一个或两个可能是空叶子。

用途:

红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如即时应用(real time application)中有价值,而且使它们有在提供最坏情况担保的其他数据结构中作为建造板块的价值;例如,在计算几何中使用的很多数据结构都可以基于红黑树。
红黑树在函数式编程中也特别有用,在这里它们是最常用的持久数据结构之一,它们用来构造关联素组和集合,在突变之后它们能保持为以前的版本。除了O(log n)的时间之外,红黑树的持久版本对每次插入或删除需要O(log n)的空间。
红黑树是的一种等同。换句话说,对于每个 2-3-4 树,都存在至少一个数据元素是同样次序的红黑树。在 2-3-4 树上的插入和删除操作也等同于在红黑树中颜色翻转和旋转。这使得 2-3-4 树成为理解红黑树背后的逻辑的重要工具,这也是很多介绍算法的教科书在红黑树之前介绍 2-3-4 树的原因,尽管 2-3-4 树在实践中不经常使用。

 

 

 

posted on 2018-05-27 18:01  liangyuhang  阅读(293)  评论(0编辑  收藏  举报