随笔分类 - 数据结构练手
摘要:二叉搜索树的复杂度为(lgN), 二叉搜索树就是已排序数列的二叉树表示法。二叉搜索树的定义是: 父节点大于等于左孩子,右孩子大于父节点。因此,若是遍历次序为(中序):左孩子,父节点,右孩子,那么我们得到的将是元素从小到大的排列。同时,最左结点最小结点,最右结点是最大结点。二叉搜索树还有定义的操作便是求前驱结点和后继结点。以后继结点为例: 若有右子树,则后继结点为右子树的最小结点;若无右子树,则后继结点为某个祖先父节点,其祖先结点(包括自身)为父节点的左孩子。以前驱为例: 若有左子树,则前驱结点为左子树的最大结点; 若无左子树,则前驱结点为某个祖先父节点,其祖先结点(包括自身)为父节点的右孩子。
阅读全文
摘要:排序,重要性不言而喻。 今天练手了快排,堆排序,和插入排序, 二分查找。 快排参考了 http://blogread.cn/it/article/612?f=sr ,写的不错! 可以看看。先总结下: 边界值很重要,一定要考虑到。说下快排,这个排序自诞生起,就引起了轰动,也名列十大经典算法之一。它主要分为两个步骤,划分和递归, 其中划分是算法的核心,递归是重要的思想。递归部分伪代码如下:1 quicksort(A[], p, r)2 if p < r3 q = partition(a, p, r)4 quicksort(a, p, q-1)5 qu...
阅读全文
摘要:堆,是一个相当重要的数据结构,它是优先队列,堆排序,Dijkstra等算法的实现保证!堆的主要特性是:1、根结点是最大/最小的,而这个主要的区别,就是实现比较操作时是less or greater, 因此可以使用纯虚化 比较接口,把实现放到子类。 附: STL中采用的是模板默认参数的方法实现。2、需要两个表示大小的变量来标定堆or数组的大小。因为pop操作因让堆的有效长度变小,而数组的长度不变。3、堆的插入操作一般是插入到数组的末尾,这里最好用vector, 因为它可以在常数时间内尾插入数据且能够动态生长。 1 #include <vector> 2 #include <os
阅读全文
摘要:晚上和朋友出去小饮了几杯,调侃了下blablabla。。。现在有点晕乎乎的,文章可能很凌乱,算是很抱歉。下午实现了下链表形式的二叉树,顿时感觉数据结构的实现,理论和实际的差距还是很大的。要走的路还是很长远的。总结下,就是递归很重要,这个是解决树问题的核心钥匙!对于二叉树,很多实现是基于排序二叉树的线性表示,即可以根据父节点的索引直接定位到子节点的位置,即 parent*2 = leftChild, parent*2+1=rightChild等等,一切可以用公式表示。本文,我们采用指针形式来实现。每个数据结构的实现,首要是实现结点类的设计。根据需求,我们知道它有三个指针域,分别指向父节点,左结点
阅读全文
摘要:STL中的栈和队列是基于deque实现的,本质是在stack/queue类内存在一个deque对象,让后stack/queue的成员方法调用下deque的个别接口,就自定义出来了栈和队列。因此这个实现我算在前一章的chain中就做了,本文就基于数组来实现下栈和队列。对于stack,只能对栈顶进行push和pop操作,算是最简单的。因此,我们可以把栈类的定义如下: 1 template<class T> 2 class MyStacked{ 3 protected: 4 T* elements; 5 int size; 6 int capa...
阅读全文
摘要:双向链表实现今天晚上用模板方法把双向链表实现了下,由于有点小粗心,在 insert中手抖了下,把tail->prev 打成了 tail->next,由于错误是发生在drop函数执行时,让我一直去调drop函数,调了半天还是一样错误,最后我系统在vs中监视了下值的变化,终于看到是insert出错了。 看来程序员离不开调试呀。另外,昨天说的模板输出重载,我说要在友元的实现时加上 <>, 但是今天我在gcc中测试了下,居然说找不到匹配的函数,导致编译不通过,真心蛋疼,vs和g++的区别还真心大,看来改天要好好专研下模板输出重载,知道的朋友希望能够告知下。对数据结构的实现,其实
阅读全文

浙公网安备 33010602011771号