
数据结构与算法
文章平均质量分 78
稚枭天卓
manu
展开
-
数据结构基础 背包问题(一) 之 非递归解
【问题描述】“背包题目”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,…,wn,希望从N件物品中选择若干物品,所选物品的重量之和恰能放进该背包,即所选物品的重量之和即是S。递归和非递归解法都能,试非递归算法求得“背包题目”的一组解【算法分析】1.此程序是得到问题的所有解;2.本题只对背包有重量约束;3原创 2015-08-02 15:50:07 · 1768 阅读 · 0 评论 -
数据结构基础 之 最长递增子序列
问题给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4. 解法1:最长公共子序列法这个问题可以转换为最长公共子序列问题。如例子中的数组A{5,6, 7, 1, 2, 8},则我们排序该数组得到数组A‘{1,原创 2015-09-26 22:54:04 · 893 阅读 · 0 评论 -
数据结构基础 从01背包问题理解动态规划
01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大? 这个问题有两种解法,动态规划和贪婪算法。本文仅涉及动态规划。 先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决? 首先想到的原创 2015-09-23 15:47:19 · 1106 阅读 · 1 评论 -
数据结构基础 查找算法(一)
1. 顺序查找顺序查找就是从序列的第一个元素开始,从头到尾逐个查找,直到找到所需的数据或搜索完整个序列。程序设计如下:#include #pragma hdrstop#include #pragma argsusedint search(int *,int,int);int _tmain(int argc, _TCHAR* argv[]){原创 2015-09-15 10:48:15 · 838 阅读 · 0 评论 -
数据结构基础 排序算法(三)算法的稳定性
排序算法的稳定性就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位原创 2015-08-23 01:37:04 · 1279 阅读 · 0 评论 -
数据结构基础 之 二叉搜索树的思想与实现
首先,本文阐述二叉搜索树的基本概念,然后,对二叉搜索树的数据结构进行性能分析与给出优化数据结构。最后,贴上了二叉搜索树的创建与遍历的源码。原创 2015-07-06 16:22:17 · 1020 阅读 · 1 评论 -
数据结构基础 希尔排序 之 算法复杂度浅析
希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现,而且它的速度很快。Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序原创 2015-09-06 21:18:20 · 10893 阅读 · 0 评论 -
数据结构基础 图的遍历(二) 之 BFS
本文从三个方面着手介绍广度优先遍历,首先,详述图的广度优先遍历等相关概念;然后,给出广度优先遍历图例示例分析;最后,给出遍历算法思想与代码实现。原创 2015-07-11 16:57:12 · 1318 阅读 · 0 评论 -
数据结构基础 之 最短路径 贪心算法
Dijkstra算法是解单源最短路径问题的贪心算法。其基本思想是,设置顶点集合点集合S并不断地做贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的其一顶点。把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组Distance记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度原创 2016-03-17 10:59:53 · 1320 阅读 · 0 评论 -
数据结构基础 字符串相似度与最长公共子序列
字符串的相似性:如果将一个串转换成为另一个串所需的操作数最少,那么可以说这两个串是相似的。另外一种权衡的方法是,寻换第三个串s3,如果s3都出现在s1和s2中,且出现的顺序相同,但不要求在s1和s2中连续,那么s3的长度越大,就说明相似度越高。 后一种对相似度概念命名为最长公共子序列。 1、最长公共子序列的特征 如果用暴力搜索原创 2016-03-21 20:49:08 · 921 阅读 · 1 评论 -
数据结构基础 之 深入理解二叉堆建立的时空复杂
本文从,堆排序的建堆函数与堆调整函数入手,详细解析了堆排序中建堆函数与堆调整函数的时间复杂度,通过剖析源码细节,分别深入了解了函数粗估与精算的时间复杂度。原创 2015-07-18 16:15:14 · 1419 阅读 · 0 评论 -
A* 算法详解
我们尝试解决的问题是把一个游戏对象(game object)从出发点移动到目的地。路径搜索(Pathfinding)的目标是找到一条好的路径——避免障碍物、敌人,并把代价(燃料,时间,距离,装备,金钱等)最小化。运动(Movement)的目标是找到一条路径并且沿着它行进。把关注的焦点仅集中于其中的一种方法是可能的。一种极端情况是,当游戏对象开始移动时,一个老练的路径搜索器(pathfinder)外转载 2016-12-31 10:37:38 · 10966 阅读 · 0 评论 -
数据结构基础 哈希表 概念篇
经典数据结构教科书中,“表”是数据结构的一个大家族。其中,有顺序表(数组)、单向链表、双向链表、循环链表等等。我们今天聊的不是这些,而是“表”中的异类——哈希表(Hash Table)。为啥需要哈希表为什么会有哈希表这种数据结构呢?让我们用一个通俗的例子来理解:大家一定都查过字典吧,我们知道,《新华字典》是按照读音排序的,可以理解为一个以读音为key,按升序排列的数据库。对于读音已原创 2015-08-22 09:21:39 · 2009 阅读 · 0 评论 -
数据结构基础 之 递归算法实例讲解
在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法。递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。(3) 递归算法解题通常显得很简洁,原创 2015-03-27 14:53:30 · 1322 阅读 · 0 评论 -
数据结构基础 排序算法(一) 概念篇
这里对笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算法原理分析、图解/flash演示/视频演示、算法代码、笔试面试重点分析、笔试面试题等板块。一、插入排序1)算法简介 插入排序(Insertion Sort)的算法原创 2015-08-02 22:03:01 · 4006 阅读 · 3 评论 -
数据结构基础 链表的插入排序程序
1.问题描述链表的插入排序程序2.测试用例链表元素依次为:0、1、2 以及 大数;3.链表的插入排序算法思想3.1 判检原链表可否实现排序;3.2 进入循环插入函数:3.2.1 复制链表当前结点;3.2.2 删除链表当前结点;3.2.3 插入链表当前结点;4.链表小注4.1 创建链表之前不要给头结点分配内存空间(避免空链表);4.2 创建链表时,原创 2015-09-06 13:31:04 · 1338 阅读 · 0 评论 -
数据结构基础 之 二叉堆实现堆排序
堆实际上是一棵完全二叉树,也称二叉堆。本文首先对二叉堆的定义和相关概念给予阐述并针对堆排序图例给出算法单步演示,而后给出二叉堆以及堆排序的代码实现,文末结合实际代码实现给出算法要点分析。原创 2015-07-16 09:41:28 · 1622 阅读 · 1 评论 -
数据结构基础 排序算法(二) 概念篇
六、鸡尾酒排序/双向冒泡排序1)算法简介 鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。2)算法描述和分析 1、依次比较相邻的两个数,将小数放在前面原创 2015-08-02 23:10:33 · 1658 阅读 · 1 评论 -
数据结构基础 图的遍历(一) 之 DFS
本文从三个方面着手介绍深度优先遍历,首先,详述图的遍历、深度优先遍历等相关概念;然后,给出深度优先遍历图例示例分析;最后,给出遍历算法思想与代码实现。原创 2015-07-11 16:10:48 · 2769 阅读 · 1 评论 -
C++ 字典排序 原理与实现
本文拟首先给出字典序的定义,字典序的物理含义;然后,介绍字典序的代码实现思想;最终,给出字典序的代码实现。原创 2015-07-03 12:03:29 · 15673 阅读 · 1 评论 -
数据结构基础 之 单链表 各类操作、思想与实现
本文从单链表头结点,头指针展开,讲述单链表的实现,分析并给出单链表创建、插入、删除、测长、输出、逆置、排序的思想与代码实现。原创 2015-04-06 20:18:24 · 1799 阅读 · 0 评论 -
数据结构基础 图的遍历(三) 之 BFS+DFS(非递归实现)
本文直接给出,图的构造函数,边添加,邻接表构造,拓扑排序,深度变量与广度遍历方法代码。原创 2015-07-14 21:07:24 · 1310 阅读 · 0 评论 -
浅析 rand7生成rand10 方法 之 代码篇(二)
【问题描述】已知有个rand7()的函数,返回1到7随机天然数,让你用rand7()生成rand10(),随机1~10。【源码实现】方法一:(rand7()-1)*7 + rand7()rand7()- 1获得一个离散整数凑集{0,1,2,3,4,5,6}(rand7()-1)*7获得一个离散整数凑集A={0,7,14,21,28,35,42}ran原创 2015-08-24 10:39:55 · 2293 阅读 · 0 评论 -
数据结构基础 各种遍历还原二叉树
面试题目或多或少会出现这样的选择题或者简答题,根据前序、中序、后序遍历还原二叉树。前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树。对于二叉树,深度遍历与此同。规律:根在前;子树在根后且左子树比右子树靠前,且第一个就是根节点;中序遍历:先访问当前节点的左子树,然后访问当前节点,最后是当前节点的右子树,二叉树,中序遍历会得到数据升序效果。规律:根在中;左子树在跟左边原创 2015-08-24 09:16:39 · 1955 阅读 · 0 评论 -
数据结构基础 后序遍历和中序遍历还原二叉树
【问题描述】二叉树 A / / B C / / / / D E F G / / / / / / / / H I J K M N O P后序遍历的结果是:HIDJKEBMNFOPGCA,我们称之为POST中序遍历的结果是:HDIBJEKAMF原创 2015-08-23 19:39:03 · 1016 阅读 · 0 评论 -
浅析 rand7生成rand10 方法 之 思想篇(一)
【问题描述】rand7是一个能生成1-7的随机数。要求利用rand7生成1-10的随机数。【算法思想】1.组合数学方法第1次 1 2 3 4 5 6 7 之中用rand7取一个数第2次从 2 3 4 5 6 7 8 之中取一个数第3次从 3 4 5 6 7 8 9 之中取一个数第4次从 4 5 6 7 8 9 10 之中取一个数第5次从 5 6 7 8原创 2015-08-23 19:15:21 · 4553 阅读 · 1 评论 -
数据结构基础 层次遍历和中序遍历还原二叉树
【问题描述】给出一个层次遍历,和一个中序遍历的结果字符串层次 A B C D E F G中序 D B A F E G C其对应的二叉树是: A / / B C / / D E / / F G【算法思想】用LEV代表层次遍历MID代表中序遍历。然后我们还需要一个HL原创 2015-08-23 19:30:29 · 2320 阅读 · 0 评论 -
C++ 迭代与递归 浅析
本文从迭代与递归的概念、源码示例以及源码分析三个维度,详细介绍并深入比较迭代与递归,这两个C++中常见的概念。原创 2015-07-24 10:06:58 · 5207 阅读 · 0 评论 -
数据结构基础 之 图 的 邻接矩阵实现与邻接表实现
首先,本文给出邻接表与邻接矩阵的概念,然后,对相关概念进行阐释并给出实现源码,最后,对两种方法进行了比较分析给出给进一步的改进方向。原创 2015-07-11 15:54:15 · 2828 阅读 · 0 评论 -
数据结构基础 之 双链表 与 循环链表 各类操作、思想与实现
双链表 相较于 单链表 其结点多了一个前向指针域,首尾结点互连;循环链表 相较于 单链表 其尾结点多了一个指向头结点的指针;双链表其操作 如 创建,插入,删除,排序,输出,测长,逆置 除添加一个前向指针域外与单链表基本相似 ;循环链表解决实际问题实例,即,约瑟夫问题、魔术师发牌问题、拉丁方阵。单链表、双链表、循环链表代码实现,可依次参考:http原创 2015-04-06 21:38:33 · 998 阅读 · 0 评论 -
数据结构基础 之 二叉堆 概念篇
本文从二叉堆的定义、基本操作、源码思想、时空复杂度和注意要点5个方面介绍二叉堆。【二叉堆定义】二叉堆是完全二叉树和近似二叉树,二叉堆满足堆特性:父节点的键值总是与任何一个子节点的键值保持固定的序关系,且每个节点的左子树和右子树都是一个二叉堆。当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆。【二叉堆操作】1.二叉堆插入:二叉堆插入只需要将插入数组尾部,然后和父节点比较判断是否需要交换(如果是最小堆,当插入点比父节点小则交换,如原创 2015-07-16 14:24:45 · 1011 阅读 · 0 评论 -
数据结构基础 之 双链表
双链表双向链表(Double Linked List) 双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。非空双向链表 ①双链表由头指针head惟一确定的。 ②带头结点的双链表的某些运算变得方便。 ③将头结点和尾结原创 2015-09-01 21:14:42 · 789 阅读 · 0 评论 -
数据结构基础 之 循环链表
循环链表是一种首尾相接的链表。(1)单循环链表——在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点即可。(2)多重链的循环链表——将表中结点链在多个环上。带头结点的单循环链表非空表空表判断空链表的条件是head==head->next;仅设尾指针的单循环链表 用尾指针rear表示的单循环链表对开始结点a1和终端结点an查找时间都是O(1)。而表的操作常常是在表的首尾位置上进行,因此,实用中多采用尾指针表示单循环链表。带尾指针的单循环链表可见下图。循环链表的特点循环链表原创 2015-09-01 21:12:33 · 974 阅读 · 0 评论 -
数据结构基础 算法复杂度分析(一) 概念篇
为什么要进行算法分析?预测算法所需的资源计算时间(CPU 消耗)内存空间(RAM 消耗)通信时间(带宽消耗)预测算法的运行时间在给定输入规模时,所执行的基本操作数量,或者称为算法复杂度(Algorithm Complexity)如何衡量算法复杂度?内存(Memory)时间(Time)指令的数量(Number of Steps)特定原创 2015-08-02 20:14:34 · 1271 阅读 · 0 评论 -
数据结构基础 算法复杂度分析(二) 典例篇
示例代码(1)decimal Factorial(int n) { if (n == 0) return 1; else return n * Factorial(n - 1); }【分析】阶乘(factorial),给定规模 n,算法基本步骤执行的数量为 n,所以算法复杂度为 O(n)。示例代码(2)int FindMaxElement(int[] array) { int max = array[0]原创 2015-08-02 20:24:11 · 875 阅读 · 1 评论 -
数据结构基础 查找 之 二分查找
二分查找又称折半查找,对排好序的数组,每次取这个数和数组中间的数进行比较,复杂度是O(logn)。本文在阐述二分查找算法思想的基础上给出递归、非递归以及STL三种方式的源码实现,现详述如下。原创 2015-07-28 10:51:50 · 2753 阅读 · 3 评论 -
数据结构基础 之 树与二叉树 各种遍历、思想与实现
本文首先阐述树的基本概念与特点,二叉树的基本概念与特点;然后,给出二叉树的代码实现,包括二叉树的创建、三序遍历+层序遍历、深度求解、平衡二叉树判断源码、层次遍历二叉树,最后将给出常见OJ树题目的实现思想。原创 2015-07-05 20:40:50 · 2226 阅读 · 5 评论