数据结构与算法 问题集

 #返回上一级

@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) 

 

 

 #返回上一级

posted @ 2014-01-10 11:04  张海拔  阅读(812)  评论(0编辑  收藏  举报