下中位数:
P119 9章 下中位数 i=L (n+1) /2 」
下中位数的意义:
- 描述 :已知递增有序数组a,b,长度分别为m,n。找出a,b(合并为一个大的有序数组后)的中位数(或下中位数)。要求时间复杂度为o(log(m+n)).
- 分析 :对于数组a,若a的长度m为奇数,则a[(m-1)/2]即为中位数;若m为偶数,则a[(m-1)/2]为下中位数;可知若一个数为中位数,则它大于(m-1)/2 个数。
a,b总长度为m+n,则其中位数应该大于(m+n-1)/2个数,那么它应该是第(m+n-1)/2+1 个数;
可以利用kth_of_two_sort_array(求第k个数)的算法,取k = (m+n-1)/2+1 时即为中位数(或下中位数)。
由于a递增,对于某一元素a[p],可知a[p]中有p个数小于a[p];若a[p]在b中刚好大于(m+n-1)/2-p个数,则a,b合并后a[p]大于p+(m+n-1)/2-p =(m+n-1)/2个数, 故a[p]为中位数。
栈:
P129 栈Stack PUSH/POP
栈的意义:
-
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)
-
栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。
队列:
P130 队列queue head 出队位置 tail 入队位置先进先出
队列的定义:
-
队列是一种线性数据结构,也就意味着它的本质上就是有特殊功能的数组,当然我们不能直接用一个数组来实现它。具体实现方法我后面会说。
同时,队列的英文为queue,是一种具有先进先出机制的数据结构,相当于说,队列就是先进去的先出来,后进去的后出来,井然有序,绝不会出现插队的现象。 -
它支持的改变队列内部结构和值的操作应有两个
在整个队列的尾部增加一个元素
在整个队列的头部删除一个元素
而一般来说,队列所支持的访问操作应有四个:
查询队列是否为空
查询队列的元素个数
查询队首(head)的值
查询队尾(tear)的值
链表:
P131链表 linkedlist key和next ,prev;单链没有prev
链表的定义和特点:
-
一个完整的链表应该由以下几部分构成:头指针:一个和结点类型相同的指针,它的特点是:永远指向链表中的第一个结点。上文提到过,我们需要记录链表中第一个元素的存储位置,就是用头指针实现。
-
结点:链表中的节点又细分为头结点、首元结点和其它结点:头结点:某些场景中,为了方便解决问题,会故意在链表的开头放置一个空结点,这样的结点就称为头结点。也就是说,头结点是位于链表开头、数据域为空(不利用)的结点。
-
首元结点:指的是链表开头第一个存有数据的结点。
其他节点:链表中其他的节点。也就是说,一个完整的链表是由头指针和诸多个结点构成的。每个链表都必须有头指针,但头结点不是必须的。
有根树、二叉树:
P137有根树 二叉树 p , left , right分支无限制,有根树左孩子右兄弟
有根树的定义和特点:
- 有根树,顾名思义,就是有根节点的树结构。
有根树的节点之间存在父子关系,其中,有一个节点,叫做“根节点”。根节点没有父节点。
在上面这棵树里,如果我们想要知道每一个节点的确切位置,我们只需要存储当前节点的最左侧子节点和紧邻的右兄弟节点即可确定当前节点在整个树中的位置。
这就是“左子右兄弟表示法”,根据这个方法,我们能通过遍历得到每一个节点的位置信息。