
数据结构和算法
1024小豆子
这个作者很懒,什么都没留下…
展开
-
分治、动态规划和贪心
概念分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。设计过程Divide:整个问题划分为多个子问题Conquer:求解各子问题(递归调用子问题的算法) Combine:合并子问题的解, 形成原始问题的解分析过程建立递归方程T(n)=原创 2017-08-10 11:12:36 · 1720 阅读 · 0 评论 -
寻找主元素
之前上算法课有一道题叫“寻找主元素”,后来发现和《编程之美》上的“寻找发帖水王”类似,即找出一组元素中数量超过一半的元素。比如有n个元素,如果元素a的数量>n/2,则a为主元素,如果不存在这样的元素,则返回null。 比较好的思路,同时也是编程之美上的思路:每次删除两个不同的元素,那么剩下的元素中,主元素的数量仍然超过一半,然后不断重复这个过程,直到只剩下一个元素,然后再判断该元素是否为主原创 2017-08-29 16:25:16 · 1948 阅读 · 0 评论 -
一些常见排序算法的总结
直接插入排序插入排序是一种简单直观的排序方法,其基本思想是按其元素大小插入到前面已经排好序的子序列中。就像打牌抓牌时按照大小排好一样。步骤:数组a[0…i-1]已经有序查找a(i)在a[0…i-1]中的插入位置k将a[k…i-1]所有元素全部后移一位将a(i)复制到a(k) 比较次数和移动次数取决于待排序表的状态。最好情况下表中已经有序,时间复杂度为O(n)。适...原创 2017-08-12 17:25:42 · 1199 阅读 · 0 评论 -
字符串的全排列问题
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 解题思路:分成两步,第一步,求出所有可能出现在第一个位置的字符,即把第一个字符分别和后面所有的字符进行交换。第二部,固定第一个字符,求后面所有字符的排列,这时,把后面的字符分成两部分。。。下面引用一张图原创 2017-10-23 10:34:12 · 1120 阅读 · 0 评论 -
二叉树前中后序遍历——迭代和栈方式实现
二叉树前中后序遍历——迭代和栈方式实现用递归实现三种遍历方式只需改变递归顺序就可以实现任一顺序的遍历。而使用栈方式,则不同情况需要进行不同的考虑。首先,定义一个简单的二叉树节点的数据结构类:class Node { int val; Node left; Node right; public Node(int val) { this.val = val; ...原创 2018-03-08 20:12:19 · 10437 阅读 · 3 评论 -
Java源码阅读——TreeMap和红黑树
Java源码阅读——TreeMap和红黑树红黑树什么是红黑树红黑树是基于二叉搜索树的,为了能以较快的时间O(logN)来搜索一棵树,需要保证树总是平衡的(或者至少大部分是平衡的),这就是说对树中的每个节点在它左边的后代数目和在它右边的后代数目应该大致相等。红黑树就是这样的一棵平衡树,对一个要插入的数据项,插入例程要检查会不会破坏树的特征,如果破坏了,程序就会进行纠正,根据需要改变树的结构,从而保持...原创 2018-03-12 21:40:44 · 367 阅读 · 1 评论 -
动态规划——01背包问题
问题描述01背包问题是特别经典的一个DP(DynamicProgramming)动态规划问题。在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。也就是往包里放总价值最大的东西,所以一个物品拿与不拿就成了选择的问题。例如有如下物品(2/3)、(4/4)、(3/3)三样物品(w/p),背包空间5,如果拿价值最大的(4/4),则拿不了其他东西...原创 2018-03-27 14:40:02 · 321 阅读 · 0 评论 -
图的遍历——BFS和DFS
BFSBFS(Breadth First Search)广度优先搜索,类似于二叉树的层序遍历,基本思想:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问过的邻接顶点w1,w2,...,wn,然后再依次访问w1,w2,...,wn所有未被访问过的邻接顶点。。。类似的思想还将应用于Dijkstra单源最短路径算法和Prim最小生成树算法。广度优先搜索是一种分层查找过程,不像深度优先有往回退的情...原创 2018-03-27 16:18:41 · 1976 阅读 · 0 评论 -
KMP算法Java实现
KMP算法Java实现字符串模式匹配问题,是求pattern模式字符串在target目标字符串中的位置。一般的暴力求解方法时间复杂度是O(m*n),而KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配。其改进在于每当一趟匹配过程中出现字符比较不相等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将pattern模式字符串向右滑动,继续进行比较。这里有最通俗易懂的介绍KMP的思想:...原创 2018-03-28 13:58:06 · 295 阅读 · 0 评论