随笔分类 -  Algorithm

二叉查找树
摘要:概念与定义 一棵二叉查找树是一棵二叉树,其中每个节点都含有一个键(以及相关联的值,即key-value对), 且每个节点的键都大于其左子树中任意节点的键而小于其右子树中任意节点的键。 (图中数字表示节点的键,由于键的唯一性,后续内容皆用键代指节点) 节点的定义 二叉树中的一个节点应当包含,一个键、一 阅读全文

posted @ 2018-08-03 20:34 Deltadeblog 阅读(275) 评论(0) 推荐(0)

使用广度优先搜素查找路径
摘要:使用深度优先搜索可以找到一个顶点到其他顶点的路径,但该路径不一定是最短路径。 广度优先搜索可以找到点与点之间的最短路径。 实现方法 先将起点加入队列,让后重复一下步骤直到队列为空: 取队列中的下一个顶点v并标记它; 将与v相邻的所有未被标记的顶点加入队列。 示例: 首先顶点0加入队列中,然后开始循环 阅读全文

posted @ 2018-05-16 21:02 Deltadeblog 阅读(231) 评论(0) 推荐(0)

使用深度优先搜索查找路径
摘要:给定图G及起点s,查找从s到其他顶点的路径。 设计一个类实现该算法,类的API如下: 基于深度优先搜索实现路径查找,该算法扩展深度优先搜索,在原算法的基础上添加一个实例变量edgeTo[],这个数组用于记录每个与s连通的顶点回到s的路径。 如下图: edgeTo[]的值为: 节点1与2(数组下标表示 阅读全文

posted @ 2018-05-15 20:37 Deltadeblog 阅读(2432) 评论(0) 推荐(0)

深度优先搜索
摘要:深度优先搜索用于寻找图(G)中与顶点s连通的其它顶点。 设计一个类实现该算法,类的API如下: 算法实现 用递归的方法来遍历所有的顶点,在访问一个顶点时: 将它标记为已访问; 递归的访问它的没有被标记的邻接点。 实现代码如下: 测试下图,与顶点0连通的顶点 输出结果:0 1 2 3 4 5 6 阅读全文

posted @ 2018-05-14 20:24 Deltadeblog 阅读(141) 评论(0) 推荐(0)

表示图的数据类型
摘要:有多种数据结构可以表示图(如邻接矩阵、邻接表数组),这里探讨的是使用邻接表数组表示图。 邻接表数组:使用一个以顶点为索引的列表数组,每个数组元素为一个Bag对象,对象中存储的是所有与该顶点相邻的顶点。(Bag类似于栈Stack,只能向其中添加元素)。 如下图及其邻接表数组: 由于Graph的实现需要 阅读全文

posted @ 2018-05-13 16:43 Deltadeblog 阅读(639) 评论(0) 推荐(0)

坐标判断正方形
摘要:由四个点的坐标判断其是否构成一个正方形 判断方法:四条边相等且两个对角线相等。 int[][] a = new int[2][4] x0 x1 x2 x3 y0 y1 y2 y3 int[] len = new int[6] 实现流程: 计算任意两个节点间的距离存入len数组中 对数组len进行排序 阅读全文

posted @ 2018-03-27 21:31 Deltadeblog 阅读(1348) 评论(0) 推荐(0)

上台阶问题
摘要:有n阶台阶,上楼时可以一步上1阶,也可以一步上2阶,计算共有多少种不同的上楼梯的方法。 设n阶台阶共有f(n)种不同的上楼梯方法。 因为共有两种不同的步伐,故上n阶台阶的最后一步有两种情况:从n-1阶处跨一步(上1阶),从n-2阶处跨一步(上2阶)。由此f(n) = f(n-1) + f(n-2)。 阅读全文

posted @ 2018-03-22 21:49 Deltadeblog 阅读(813) 评论(0) 推荐(0)

排序算法总结
摘要:快速排序的空间复杂度为什么是logN? 快速排序的递归代码如下: 每次递归都会返回一个中间值的位置 j , 必须使用栈存储,所以空间复杂度就是栈用的空间(栈中存储j的个数)。 j所占用栈的空间大小为 logN,这里计算栈中存储j的个数这需要考虑 递归调用 sort(a, lo, j-1) 即可,因为 阅读全文

posted @ 2018-03-18 15:22 Deltadeblog 阅读(133) 评论(0) 推荐(0)

二叉堆排序
摘要:二叉堆的内容详见上篇http://www.cnblogs.com/deltadeblog/p/8576488.html 可以利用二叉堆对数组排序,主要包含两步:将原始数组重新组织使之成为二叉堆;数组的第一个元素为最大或最小,取出后对数组使用sink()函数保持堆有序,依次进行。 堆的构造 将一个包含 阅读全文

posted @ 2018-03-17 21:10 Deltadeblog 阅读(332) 评论(0) 推荐(0)

二叉堆
摘要:二叉堆即是完全二叉树实现的堆,在二叉堆中每个节点总是大于等于其任意一个子节点。根结点是二叉堆中最大的节点。 数组实现二叉堆 完全二叉树可以用数组实现,根结点的位置为1,其子节点为2、3。位置为k的节点,其两个子节点位置为2k、2k+1 。同理,位置为k的节点,其父节点的位置为k/2 。 算法实现 使 阅读全文

posted @ 2018-03-16 16:35 Deltadeblog 阅读(383) 评论(1) 推荐(0)

快速排序
摘要:将一个数组分成两个子数组,子数组1的元素都小于等于v,子数组2的元素都大于等于v,v可取值为数组中的任意元素。 在分别对子数组进行上述排序,直到子数组的元素个数为1,整个数组排序完成。 数组切分 该算法的关键在于数组切分,即选取切分元素v,使子数组1的元素都小于等于v,子数组2的元素都大于等于v。 阅读全文

posted @ 2018-03-01 20:37 Deltadeblog 阅读(143) 评论(0) 推荐(0)

归并排序
摘要:归并排序即是将两个有序的数组归并成一个更大的有序数组。如[1,3,5] 与 [2,4,6]归并为[1,2,3,4,5,6]。 或[1,3,5, 2,4,6]归并成[1,2,3,4,5,6]。 一种实现方法是将两个有序数组中的元素按大小排列进第三个数组中。实现代码如下: 自顶向下的归并排序 将数组a[ 阅读全文

posted @ 2018-01-10 21:43 Deltadeblog 阅读(201) 评论(0) 推荐(0)

希尔排序
摘要:以下转自http://www.cnblogs.com/skywang12345/p/3597597.html 算法内容: 对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的元素放在同一个组中;然后,对各组内的元素进行直接插入排序 阅读全文

posted @ 2018-01-08 20:58 Deltadeblog 阅读(231) 评论(0) 推荐(0)

插入排序
摘要:算法流程: 将第i个元素插入其左边(或右边)的有序元素中。对于第i个元素,其左边的元素a[0], a[1], a[2], ... a[i-1]是有序的。 从第2个元素(即i=1)开始,直到最后一个元素,依次进行如下过程: a[i]与a[i-1]比较,若a[i]<a[i-1]则交换a[i]与a[i-1 阅读全文

posted @ 2018-01-07 19:48 Deltadeblog 阅读(113) 评论(0) 推荐(0)

选择排序
摘要:算法流程: 找到数组中最小的那个元素,将其与数组的第一个元素交换位置; 在剩下的元素中找到最小的,并与数组的第二个元素交换; 重复上述步骤。 算法复杂度: 准确来说是N-1次交换,前面N-1个元素已经排列完成,最后一个元素则不需要在进行排列。 算法稳定性: 选择排序是不稳定的,如序列{7,4,8,5 阅读全文

posted @ 2018-01-06 21:38 Deltadeblog 阅读(187) 评论(0) 推荐(0)

栈的一个实例——Dijkstra的双栈算术表达式求值法
摘要:Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) )。 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括号时,操作数栈弹出两个操作数,运算符栈弹出一个运算符,两个操作数按运算符计算,将结果压入操作数栈 如 阅读全文

posted @ 2018-01-03 21:14 Deltadeblog 阅读(1410) 评论(0) 推荐(0)

二分法查找 (Binary Search)
摘要:二分法查找适用于排列有序的数据。java实现方法如下: 有几点需要说明: while(lo <= hi) 必须是 <= 。若缺少=,则数组的最后一个数据一定查找失败。 每次循环lo = mid + 1;hi = mid - 1;必须加上或减去-,否则可能造成死循环。 如: 当lo与hi相邻时,lo的 阅读全文

posted @ 2018-01-02 20:25 Deltadeblog 阅读(212) 评论(0) 推荐(0)

导航