数据结构与算法
文章平均质量分 72
__Lemon__
这个作者很懒,什么都没留下…
展开
-
汉诺塔递归实现
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。古代有一个梵塔,塔内有三个座A、B、C;A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。移动过程中可以借助B座。解题思路:假设设A上有n个盘子。如果n=1,则将圆盘从A直接移动到C。原创 2014-12-26 16:07:47 · 922 阅读 · 0 评论 -
List的迭代器
引自"C++ primer plus 6"中的话:理解迭代器是理解STL的关键所在。模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。因此,它们都是STL通用方法的重要组成部分。一直觉得迭代器很神秘,在调试了简单的List迭代器之后,才认识到迭代器实质上就是遍历访问容器里面的元素。不同的容器,它的遍历方式不同,迭代器也就各不相同。数组下标的移动和指针的++就原创 2014-10-29 15:29:47 · 3757 阅读 · 0 评论 -
桶排序和基数排序
(快速总结了桶排序和基数排序,由于近期项目比较忙,很多地方没有考虑完整,日后有空再回来修改)桶排序:将数组分配到有限数量的桶子里,每个桶子再个别排序。下列中:将数据作为桶(数组)的下标存储,适合于数据值的范围比较小;比如:求在1G大小的字符串中,出现次数最多的那个字符;因为字符char的边界是[0...255],就可以将所有的字符遍历、存储到[0...255]桶中(数组下标).原创 2016-02-29 14:05:12 · 1681 阅读 · 0 评论 -
归并排序
归并排序就是将数组不断的分解(这里是二分),直到分解为独立的数据单元,再回溯、两两比较、排序,最终得到有序的数组。对数据的左右二分、合并的过程可以理解成为一个“后序遍历”。例如:以下代码参考自:白话经典算法系列之五 归并排序的实现;原文写的很好,但我稍作了改动,便于理解。不想多说什么,代码有详细注释,我想关键点是:递归二分、合并的“后序遍历”方法的理解。#inclu原创 2016-02-26 09:01:21 · 642 阅读 · 0 评论 -
选择排序与堆排序
选择排序 依次选择数组中的最小值(从小到大),并按顺序排放。从第一个数开始,依次遍历数组中的数据,找出最小值,并与第一个数交换位置;从第二个数开始,依次遍历(剩余)数组中的数据,找出最小值,并与第二个数交换位置;... ...堆排序堆的概念:在一颗完全二叉树中,子结点的值总是小于父结点的值(大根堆),或者子结点的值总是大于父结点的值(小根堆)。我想,堆排序之所以也属原创 2016-02-24 15:18:17 · 681 阅读 · 0 评论 -
插入排序与希尔排序
插入排序就像打“斗地主”一样,手中的牌按大小顺序排列,当新拿到一张牌,插入手中合适的位置。对于数组的插入排序,在新数据插入到合适位置之前,必须给该数据腾出空间(需要对大于该数据的原数据进行移位)。插入排序的原理相对较简单,插入排序对于有序的序列效率很高,详见下面代码。希尔排序是插入排序的加强版,希尔排序增加了一个“步长”(也有的叫增量),既将现有的数据按照一定的步长分组,对该组内的数据原创 2016-02-23 09:26:41 · 618 阅读 · 0 评论 -
理解“红黑树”
(本文主要参考与网络上一些文章加上自己的理解,代码来自JULY http://blog.csdn.net/v_JULY_v/article/details/6169600 )在真正理解红黑树之前,我觉得它是一座难以翻越的大山;当我有点理解了它,如释重负。看红黑树之前,我看了AVL树,觉得还是比较好理解,对于红黑树,我曾经有一些疑问:1.为什么要用红黑来标记?2.红黑结点如何做到原创 2016-02-02 10:13:29 · 812 阅读 · 1 评论 -
AVL树
大概学习了一下AVL树,基本思路还是比较清楚,但是发现还是很难自己写一个AVL树来。下面记录下自己学习的过程(网上资料很多,就不解释AVL了):1.参考的代码: http://rosettacode.org/wiki/AVL_tree#C.2B.2B2.图形化参考工具: https://www.cs.usfca.edu/~galles/visualization/AVLt原创 2016-01-22 15:50:02 · 1123 阅读 · 0 评论 -
背包问题
有一个小偷,跑到一户人家去偷东西;小偷可以偷6样物品,重量分别为:weight[6] = {1,2,2,6,5,4},对应的价值分别为value[6] = {1,6,3,5,4,6};小偷只背了一个最大容量为10的包;问:小偷可以偷走的最大价值是多少?解题思路:1).找最贵的偷;2).找装的最多(最轻)的偷;3).动态规划求得最优值。动态规划的原理就是:根据原创 2016-01-07 14:39:45 · 1015 阅读 · 0 评论 -
图的邻接表表示
有一幅图:图的“顶点”为:1,2,3,4,5,6,7,8 用下面三个结构体表示图的邻接表存储信息://“结点”结构体,存储与“顶点”相连的顶点typedef struct node{ int adjVex; //“顶点”对应的“结点”信息 struct node *next; //指向下一个与“某顶点”相连的结点}EdgeNode;//顶点结构体t原创 2015-12-22 09:28:46 · 1074 阅读 · 0 评论 -
“数据结构与算法”有点难
看了一周左右的“数据结构与算法”,每天大概专注45分钟左右时间;扫了2本书,算是浏览一下大纲,找寻一下以前的记忆,在大脑里面重新构建了一个体系。虽然是“扫读”,刚开始的时候还是昏昏欲睡,现在觉得自己刚刚迈出了第一步。 关于“数据结构与算法”,我在实际项目中用到的都是很简单的,可能是因为我做的项目偏重于业务方面,所以我在数据结构上基本上没什么积累。记得在上学的时候,一看到数据结构就原创 2015-12-02 10:51:43 · 3155 阅读 · 0 评论 -
二叉搜索树(BST)
BST(binary search tree)是具有下列性质的二叉树:1.若左子树不为空,则左子树上所有结点的值均小于它的根结点的值;2.若右子树不为空,则右子树上所有结点的值均大于它的根结点的值;3.左、右子树也分别为二叉排序树;4.没有键值相等的节点。BST的一些基本操作(添加结点,查找,删除,遍历)添加:添加元素elem从根结点开始比较,如果elem比根结点小原创 2016-01-19 16:35:10 · 959 阅读 · 0 评论 -
最短路径(Dijkstra)
有一幅无向图图对应的邻接表char *vertexArray[8] = {"a", "v1", "v2", "v3", "v4", "v5", "v6", "b"};int undiGraph[8][8] = { //a,v1,v2,v3,v4,v5,v6, b //a {X, 2, 8, 1, X, X, X, X}, //1+7+2原创 2015-12-09 09:29:35 · 886 阅读 · 0 评论 -
深度优先搜索(DFS)与广度优先搜索(BFS)
图遍历的过程其实很容易理解(很多方法即使不看书也能比划出来),难点是思路清晰的用计算机理解的方式表达出来。矩阵是一种表示图的信息很好的方法(顶点比较少时适用),每个结点与其它结点的关联都可以表示出来。矩阵每行代表每个结点可以访问的其它结点(列可以想象成某结点可以被哪些其它结点访问)。直接看代码与注释:#include #include #include #in原创 2015-12-14 15:52:26 · 891 阅读 · 0 评论 -
数据结构理论学习
1.为什么要有数据结构? 因为要将现实世界中各种“关联数据”用二进制形式保存在计算机内存(ROM、RAM、SRAM……)或外存(光盘、硬盘、U盘……)中。然后让CPU(用预先设定好的加减乘除、逻辑与或非、移位、条件转移等机器指令)按照人的意愿去处理这些数据。 由此,我们可以得出: 数据结构 = 数据 + 关系 而我们都知道: 程序=数据结构+算法原创 2015-02-28 18:04:18 · 926 阅读 · 0 评论 -
快速排序和冒泡排序
冒泡排序和快速排序都是通过交换位置进行排序,快速排序是冒泡排序的改进。冒泡排序:从第一个数开始,依次比较相邻两个数;如果前面的数大于后面的数,交换位置(从小到大排序);每轮比较完后最大数被移动到末位,所以下轮比较时不用比较最后一个数;有N个数,每轮比较完成后,本轮最大的数在最后;那么N-1轮之后,所有数按顺序归位。可设置标记flag,如果某轮比较完成后没有发生交换,结束排序过程原创 2015-02-26 16:24:39 · 1036 阅读 · 0 评论 -
理解递归
递归的基本思想就是:把问题分解成为规模更小的、具有与原问题有着相同解法的问题。(Recursion is the process of repeating items in a self-similar way.)在编程中,最常用的例子就是斐波那契数列的求解,我在下列中用了4种方法,加深对递归的理解。#include using namespace std;//递归 //优点:原创 2017-05-10 10:30:01 · 613 阅读 · 0 评论