数据结构与算法 问题集
@Author: 张海拔
@Update: 2014-6-1
@Link: http://www.cnblogs.com/zhanghaiba/p/3513330.html
【基础数据结构】
◇◇线型结构
◇◇◇◇线性表之静态表(基于数组和静态分配空间)
◇◇◇◇◇◇◇◇静态表之整型数组的插入、删除、查找 link(public)
◇◇◇◇◇◇◇◇有序数组的合并 link(public)
◇◇◇◇◇◇◇◇用数组模拟约瑟夫问题 link(public)
◇◇◇◇◇◇◇◇怎样实现大整数的乘法?(指定规模)
◇◇◇◇◇◇◇◇怎样实现动态数组?(任意规模)
◇◇◇◇◇◇◇◇二维数组的转置
◇◇◇◇◇◇◇◇静态表之字符数组(字符串)的字符统计
◇◇◇◇◇◇◇◇字符串反转、旋转
◇◇◇◇◇◇◇◇字符串匹配问题与KMP算法
◇◇◇◇◇◇◇◇怎样实现一个strstr()?
◇◇◇◇线性表之动态表(基于指针和动态分配空间)
◇◇◇◇◇◇◇◇单链表的创建、插入、删除、查找 link(public)
◇◇◇◇◇◇◇◇怎样就地反转单链表? link(public)
◇◇◇◇◇◇◇◇有序单链表的合并 link(public)
◇◇◇◇◇◇◇◇怎样判断单链表是否存在环路?
◇◇◇◇◇◇◇◇怎样确定链表中倒数第k个节点?
◇◇◇◇◇◇◇◇怎样高效地解决约瑟夫问题?
◇◇◇◇◇◇◇◇双链表
◇◇◇◇◇◇◇◇伪链表
◇◇◇◇◇◇◇◇#数组和链表个人总结 link(private)
◇◇◇◇栈
◇◇◇◇◇◇◇◇栈的数组实现和括号匹配的检查 link(public)
◇◇◇◇◇◇◇◇栈的链表实现
◇◇◇◇◇◇◇◇怎么实现Linux下的逆波兰计算器dc? link(public)
◇◇◇◇队列
◇◇◇◇◇◇◇◇怎样用两个栈模拟一个队列?
◇◇◇◇◇◇◇◇怎样实现实现优先队列?
◇◇树型结构
◇◇◇◇二叉树
◇◇◇◇◇◇◇◇二叉树的几种创建方法 link(public)
◇◇◇◇◇◇◇◇由遍历序列创建二叉树 link(public)
◇◇◇◇◇◇◇◇二叉树四种遍历方法
◇◇◇◇◇◇◇◇二叉树前序中序和后序遍历的非递归实现
◇◇◇◇◇◇◇◇怎样优化二叉树的遍历?
◇◇◇◇◇◇◇◇怎样求二叉树的高度和宽度(非递归)?
◇◇◇◇◇◇◇◇怎样求二叉树节点间最远距离(二叉树“直径”)?
◇◇◇◇◇◇◇◇怎样求二叉树指点俩节点的最近公共祖先?
◇◇◇◇◇◇◇◇二叉树的旋转操作和平衡判断 link(public)
◇◇◇◇◇◇◇◇怎样输出二叉树的所有路径(按字典序)? link(public)
◇◇◇◇◇◇◇◇二叉树所有路径问题的应用(如最大权值路径、权值为K的路径)?
◇◇◇◇哈夫曼树(最优二叉树)
◇◇◇◇◇◇◇◇哈夫曼树的创建
◇◇◇◇◇◇◇◇哈夫曼树的编码与解码
◇◇◇◇◇◇◇◇怎样制作一个文本文件压缩软件?
◇◇图型结构
◇◇◇◇邻接矩阵
◇◇◇◇邻接表 link(public)
◇◇◇◇◇◇◇◇邻接表和邻接矩阵的相互转换 link(public)
◇◇集合结构(主要用于动态操作)
◇◇◇◇堆
◇◇◇◇二叉排序树(二叉搜索树、二叉查找树)
◇◇◇◇◇◇◇◇二叉排序树删除、搜索、插入的递归实现 link(public)
◇◇◇◇◇◇◇◇二叉排序树删除、搜索、插入的迭代实现 link(public)
◇◇◇◇◇◇◇◇怎样把二叉排序树转换为有序双链表
◇◇◇◇◇◇◇◇排序二叉树中求最近公共祖先
◇◇◇◇平衡二叉树之AVL
◇◇◇◇◇◇◇◇AVL的递归实现
◇◇◇◇◇◇◇◇AVL的迭代实现
◇◇◇◇哈希表(散列表)
【高级数据结构】(实用)
◇◇◇◇并查集
◇◇◇◇线段树
◇◇◇◇Tire树(字典树)
◇◇◇◇Tire图和AC自动机
◇◇◇◇B树
◇◇◇◇平衡二叉树之红黑树
【经典算法】
◇◇查找算法(静态)
◇◇◇◇直接查找
◇◇◇◇◇◇◇◇直接查找的优化实现
◇◇◇◇二分查找(有序静态表)
◇◇◇◇◇◇◇◇如何实现sqrt()?
◇◇◇◇◇◇◇◇怎样快速求幂?
◇◇排序算法(内部排序)
◇◇◇◇基本排序方法:冒泡排序、简单选择排序、直接插入排序 link(public)
◇◇◇◇快速排序 link(public)
◇◇◇◇◇◇◇◇怎样快速求数组中第k大的数?
◇◇◇◇堆排序 link(public)
◇◇◇◇◇◇◇◇怎样找出前k大的k个数(Top k 集合问题)?
◇◇◇◇希尔排序 link(public)
◇◇◇◇归并排序 link(public)
◇◇◇◇◇◇◇◇怎样求出逆序对数(Inverse Number)? link(public)
◇◇◇◇◇◇◇◇怎样提升大整数乘法的效率?
◇◇◇◇基数排序
◇◇◇◇链表的排序
◇◇◇◇◇◇◇◇怎样实现链表的归并排序 link(public)
◇◇◇◇线性时间排序
◇◇◇◇◇◇◇◇位图数据结构及其排序 link(public)
◇◇◇◇排序的实际使用
◇◇图算法
◇◇◇◇DFS和BFS link(public)
◇◇◇◇单源最短路(Dijkstra算法) link(public)
◇◇◇◇拓扑排序 link(public)
◇◇◇◇最小生成树
◇◇搜索算法
◇◇◇◇状态搜索
◇◇◇◇◇◇◇◇倒水问题
◇◇◇◇◇◇◇◇八数码问题
◇◇◇◇剪枝优化
◇◇◇◇回溯法
◇◇◇◇◇◇◇◇怎样输出可重集的全排列 link(public)
◇◇◇◇◇◇◇◇例题: 排列搜索 link(public)
◇◇◇◇◇◇◇◇八皇后问题
◇◇◇◇动态规划
◇◇◇◇◇◇◇◇最大连续和问题
◇◇◇◇◇◇◇◇最长公共子序列
◇◇◇◇◇◇◇◇DAG的最长路问题(滑雪)
◇◇◇◇◇◇◇◇DAG的路径计数问题
◇◇◇◇◇◇◇◇无限背包和0/1背包问题
◇◇◇◇启发式搜索
◇◇◇◇◇◇◇◇A*算法
实现方案:
(1)实现语言:标准C、有些实现会再用Python写(后期计划)。
(2)通用性:作为demo级别,通常只支持简单内建数据类型,比较适合OJ刷题。
(3)工程性:前期大部分实现都不加入错误检查,后期考虑用assert()或<setjmp.h>,一般假定输入数据合法。
至于C语言中基本的模块封装方法(文件分离、extern和static的linkage)只能在函数接口组前面加注释public和private来模拟(提示)。
尽量设计好接口(函数原型),因为接口的设计关系到代码的复用性。
(4)代码风格:我一直比较喜欢Linux kernel Style,但略有不同。代码尽量做到自注释,我认为有必要的地方会有简单注释。
(5)读者定位:自己,以及数据结构和算好初级爱好者。
因为只有自己看得爽,才会经常翻阅,才会不断更新和完善,所以第一定位就是自己。
第二定位是给与我水准差不多的同学,供参考及吐槽,所以一般demo附带的说明部分不会做最基础的解释,而是尽量写一些自己的个人理解。
(6)下一目标:SGI STL问题集(全部C++实现 并对比和学习源码)
主要参考书籍:(代码均独立实现,即使个别有参照也是自己理解后独立敲出来)
《算法竞赛入门经典》 刘汝佳
《Algorithm In C》(Part 1~4) Robert Sedgewick
《The Algorithm Design Manual》(ADM) Steven. S. Skiena
《Introduction To Algorithrm》 (CLRS) Thomas. H. Cormen等
#问题集维护策略技巧等 link(private)