-----算法
文章平均质量分 83
培养算法思维
duoduo18up
对世界充满好奇 勇于尝试 喜欢编程
展开
-
海量数据处理问题
海量数据的常见处理方法: Hash方法: 解决 哈希冲突的方法: Bit-map方法: 布隆过滤器: 倒排索引 外排序法: Trie树Trie树 堆: 桶方法:桶排序及相关应用题目 MapRed...原创 2018-08-23 22:20:39 · 385 阅读 · 0 评论 -
左(进阶)算法----数据结构自设计 / 跳表
设计可以变更的缓存结构:思路:设计结构 map---储存对应的位置 + 双向链表---维持优先级还有size的限制 ----如果超过个数限制 ---则将头节点删除 并 从中找到map对应的记录(因为节点中含有map中的key)将新加入节点连在双向链表后面即可~代码实现:设计的缓存结构:注意:map 中 存值 具体和数值类型有关map 中 存放 基础类型 则就是具体的值 ...原创 2018-07-08 13:01:27 · 695 阅读 · 0 评论 -
左 . 进阶算法---KMP算法/BFPRT算法/窗口(双端队列)
KMP算法:常规想法:一个个匹配 时间复杂度太高总结: 我们发现 每次匹配前面的并没有给后面一些指导信息Note: 子串 和子序列不一样 前者是连续的 后者可以是不连续的 注意区分...原创 2018-06-28 23:21:23 · 254 阅读 · 0 评论 -
左 . 进阶算法---单调栈
单调栈:问题描述:给定一个数组 请确定每个元素左右距离最近的比它大的数字常规想法: 到某一个元素时 通过两个for 分别获取其左边比它大的和右边比他大的数字 时间复杂度为O(n2)最优解思路(单调栈):1 一个按照从大到小顺序排序的栈结构 若在压栈过程中发现要压栈的元素和栈顶的元素相比要大 则弹出当前栈顶元素 并从开始弹出处记录 之后继续弹出的下一个即为距离最近的一个元素注意...原创 2018-06-28 23:37:46 · 1618 阅读 · 0 评论 -
左 . 进阶算法---KMP算法
KMP算法:常规想法:一个个匹配 时间复杂度太高总结: 我们发现 每次匹配前面的并没有给后面一些指导信息Note: 子串 和子序列不一样 前者是连续的 后者可以是不连续的 注意区分...原创 2018-06-14 20:51:19 · 1374 阅读 · 2 评论 -
左 . 算法--- 前缀树/贪心策略/递归/ 动态规划专题
前缀树:举例: 如图所示 路径上标的是字符串中单个字符 升级 1(查找是否有特定字符串):如果要查找"de"前缀的字符串,很好做到 但是查找是否有"de"字符串就不太好确定 (因为和"def"类似的结构是相同的)所以 在刚才的基础上 在每个节点加上计数器 如果以此节点为末尾节点 则+1 升级 2 ( 确定含有特定前缀的字符串个数 ):就在每个节点处开辟另一个参数区域 用来...原创 2018-06-06 22:12:51 · 705 阅读 · 2 评论 -
左 . 算法---哈希函数/哈希表/布隆过滤器/一致性哈希算法 专题
哈希函数:常见的功能就是 打乱分布 均匀随机 输入无穷大 输出却在一定范围内 即使出现碰撞 但是每个输出对应的输入个数 概率均匀分布 没有太大偏向一个重要的性质: 如果在input域上均匀分布 那么经过哈希并%m 运算后(在0~m-1范围内) 在输出域上同样均匀分布 哈希表:经典结构:根据key算出具体的hashcode值(h)--...原创 2018-06-04 22:36:06 · 1051 阅读 · 3 评论 -
左 . 算法---排序 /栈队列/链表 专题
排序: 7大排序算法冒泡排序: 时间O(n2) 额外空间O(1) 选择排序 时间0(n2)原理就是 :在 0-n-1中找最小 -----放在位置0上 在1--n-1中找最小 -------放在位置1上 ...... 总结:选择排序和冒泡排序的排序方法与数据的状况无关 无论哪种情况总是...原创 2018-05-28 17:51:51 · 634 阅读 · 0 评论 -
《趣学算法算法 思路汇总》
算法的好坏标准 正确性:满足问题的需求,运行正常,无语法错误, 通过软件测试。易读性:简洁易懂,注释语句恰当适量。健壮性:算法对非法数据及操作有较好的反应和处理。高效性:算法运行效率高,即算法运行所消耗的时间短。低存储性:低存储性是指算法所需要的存储空间低。六字总结:高效率 低存储第二章 贪心算法一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择 从而得到全局最优的解决方案。 —...原创 2018-03-25 16:38:23 · 995 阅读 · 0 评论 -
回溯法--最优加工顺序(机器零件加工)
package com.duoduo.day316;/** * 最优加工顺序(机器零件加工问题) * 问题描述: 有n个机器零件,每个零件必须先由机器1处理,再由机器2处理。零件Ji需要机器1,2处理时间为T1i,T2i. * 如何安排零件加工顺序,使第一个零件从机器1上加工开始到最后一个零件在机器2上加工完成,所需的总加工时间最短? * 问题转化: 拿实例进行分析发现:机器...原创 2018-03-25 16:01:32 · 4349 阅读 · 2 评论 -
回溯法--n皇后问题
package com.duoduo.day316;/** * 一山不容二虎(n皇后问题) * 问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后,按照规则,皇后可以攻击与之在同行同列同斜线的棋子。故如何放置? * 问题转化: 以行为主导(每行放置一个则不可能同行)--->在第n行放置第n个皇后,第n个皇后的位置不能与前n-1个皇后同列,同斜线 * 算法设计: 1 定义问...原创 2018-03-24 16:33:11 · 1447 阅读 · 0 评论 -
回溯法--地图m着色问题
package com.duoduo.day316;/** * 地图着色问题 * 问题描述: 为区分边界,相邻区域不能有同一种颜色 * 问题转化: 将区域退化成点-->相邻区域用连线连起来-->给地图着色相当于给无向连通图的每个点着色-->要求有连线的点不能有相同颜色 * 即 经典的图的m着色问题 * * 算法设计: 1 定义问...原创 2018-03-24 11:21:06 · 4361 阅读 · 0 评论 -
回溯法--最大团(部队护卫队问题)
package com.duoduo.day316;/** * 回溯法--最大团问题 * 问题描述:为组织一支队伍,希望选出最多的居民加入队伍中,并保证其中任意两人均不是仇敌,给定仇敌关系图,计算构建护卫队的最佳方案。 * 问题转化: 从无向图G=(V,E),顶点集由n个节点组成的集合{1,2,...n}, * 选择一部分节点集V',即节点集合的一个子集,此子集中任意...原创 2018-03-24 09:15:38 · 2193 阅读 · 1 评论 -
回溯法--0-1背包问题2
package com.duoduo.day316;/** * 回溯法 * 基础:选优搜索法(按照选优条件深度优先搜索,以达到目标)能进则进,进不了则换,换不了则退 * 0-1背包问题: * * 要素:1 定义问题的解空间----n个物品(X1...xn) * 2 显约束 xi=0/1 i=1,2....n * 3 约束条件-判断装入购物车的物品总重量...原创 2018-03-23 10:47:47 · 340 阅读 · 0 评论 -
动态规划--0-1背包问题1
package com.duoduo.day316;/** * 0-1背包问题 * * 问题描述:有n个物品,每个物品的重量为w[i], 价值为v[i],购物车容量为W,选择若干个物品放入购物车 * 限制:在不超过容量的前提下使获得的价值最大 * 思路:和之前的贪心算法(背包问题)不同,故分析最优子结构后,采用动态规划思想求解 * * c[i][j]: 前i件物品放入一个容量为...原创 2018-03-22 15:55:55 · 996 阅读 · 0 评论 -
动态规划--矩阵连乘
package com.duoduo.day316;/** * 矩阵连乘问题 * 对于给定 的n个连乘的矩阵,找出一种加括号的方法,使得矩阵连乘的计算量(乘法次数)最少 * @author 多多 * */import java.util.Scanner;public class Test4_6 { public static final int msize=100; publi...原创 2018-03-19 11:33:13 · 348 阅读 · 1 评论 -
动态规划--游艇租赁
package com.duoduo.day316;/** * 游艇租赁问题 * 长江上设置了n个游艇租赁站,站i到站j之间的租金是r(i,j) 计算从站1到n所需的最少租金 * @author 多多 */import java.util.Scanner;public class Test4_5 { public static void main(String [] args) ...原创 2018-03-18 22:34:21 · 641 阅读 · 0 评论 -
动态规划---编辑距离
动态规划---把原问题分解为若干子问题 ----自底向上---求解最小子问题(结果储存在表格中)----求解大的子问题(子问题间可能有重叠,不是相互独立的)分治法-----把原问题分解为若干子问题------自顶向下解决子问题----合并子问题的解------得到原问题的解(子问题之间均是独立)算法要素: 最优子结构(问题的最优解包含其子问题的最优解)解题秘籍: 1 分析最优解的结构特征 ...原创 2018-03-18 20:42:26 · 171 阅读 · 0 评论 -
分治法--合并排序
package com.duoduo.day316;/** * 合并排序 * 分解 ----治理----合并 * @author 多多 * */import java.util.Scanner;public class MergeSort { public static void main(String [] args) { Scanner sc=new Scanner(...原创 2018-03-17 09:51:49 · 432 阅读 · 0 评论 -
分治法--二分搜索技术
package com.duoduo.day316;/** * 分治法----二分搜索/查找 * 采用递归方法 * @author 多多 * */import java.util.Scanner;import java.util.*;public class BinarySearch { public static void main(String [] args) { S...原创 2018-03-16 21:20:02 · 506 阅读 · 0 评论 -
贪心算法----哈夫曼编码
//结点类//属性 public class HNodeType { double weight; //树节点的权值 int parent; //双亲节点 int lchild; //左子节点 int rchild; //右子节点 char value; //该节点表示的字符 }//编码类public clas...原创 2018-03-16 11:46:51 · 781 阅读 · 0 评论 -
贪心算法 --最优装载问题/ 背包问题/ 会议安排问题
最优装载问题package com.duoduo.test1;/** * 最优装载问题 * 给定船能装载的最大容量 给定各个物品的重量 问最多能装载多少件物品\ * 思路:贪心策略 即先排序 然后将最小重量的古董装入 然后判断是否超过船载量 */import java.util.Scanner;import java.util.Arrays;public class T...原创 2018-03-14 21:47:14 · 742 阅读 · 0 评论 -
分治法--快速排序
原始版本:package com.duoduo.test1;/* * 快速排序:基于分治策略 * 算法思想:1 分解(取基准元素,将其左右两侧划分 * 2 治理:对两个子序列进行快速排序 * 3 合并: 将排好序的两个子序列合并在一起,得到原问题的解 * 执行过程:取基准元素 从右向左扫描 找<基准元素的值 进行交换i++ * 从左向右扫描 找到>...原创 2018-03-12 22:20:46 · 1767 阅读 · 0 评论 -
动态规划---求最大子数组之和
package com.duoduo.test1;public class Test4_2_2{ public static void main(String[] args){ //int[] array = {-9,1,3,5,-1,7,-5,3,1}; int [] array= {1,-2,4,8,-4,7,-1,-5}; int le...原创 2018-03-12 14:49:25 · 1313 阅读 · 0 评论 -
动态规划---最长的公共子序列java版本
package com.duoduo.test1;/** * 给定两个序列X={ x1,x2,.....xm} Y={y1,y2///yn} 找出两者的一个最长的公共子序列z * 采用动态规划的思想 * 1 分析最优解的结构特征 假设已经知道了最优解 * 2 建立最优解的递归式 * 3 自底向上求解最优值 并记录最优值和最优策略 * 4 构造最优解 * ...原创 2018-03-12 11:29:10 · 505 阅读 · 0 评论 -
PAT 牛客网1(Scanner用法总结) ----A+B>C
1. 给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。输入描述:输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。输出描述:对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开...原创 2018-01-15 21:23:33 · 1744 阅读 · 0 评论 -
携程2019实习生后台开发笔试题 总结
题目1:给定一个整数的数组,要求将数组中的所有的0元素移动到数组的最后,其他的元素保持原来的顺序。要求:空间复杂度不能超过O(1)example:给定数组[0,2,0,7]转换后应为[2,7,0,0]输入:第一行输入一个数组的长度其他的数为数组中元素。法1 :分析:该题目的难点在于将非0的元素移动到数组的前端的时候必须要保持数组原来元素的顺序。我们可以看出0元素是确定的元素,我们可以统计0元素的个...原创 2018-03-31 11:57:36 · 3134 阅读 · 2 评论 -
程序员面试金典 5 (字符串)
1 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。//法 1:我的想法 使用额外数据结构 字符数组public class Reverse{ public String reverseString(S原创 2018-01-07 19:56:25 · 212 阅读 · 0 评论 -
java程序员面试金典 4.2
2. 在二维平面上,有一些点,请找出经过点数最多的那条线。给定一个点集vectorp和点集的大小n,没有两个点的横坐标相等的情况,请返回一个vector,代表经过点数最多的那条直线的斜率和截距//当时觉得情况太多就放弃了//思路: 用任意两个点去确定一条直线,以斜率和截距为key,出现次数为value,存在hashmap中,最终选次数最多的即可。//面向对象的编程思想impor原创 2018-01-06 21:19:55 · 248 阅读 · 0 评论 -
java 程序员面试金典 4.1
1 .请编写一个方法,实现整数的乘法、减法和除法运算(这里的除指整除)。只允许使用加号。给定两个正整数int a,int b,同时给定一个inttype代表运算的类型,1为求a * b,0为求a / b,-1为求a - b。请返回计算的结果,保证数据合法且结果一定在int范围内。//注意点: 正整数a ,b 只能用加号 实现乘除减等运算//我减法没想出来 !public int原创 2018-01-06 16:41:39 · 343 阅读 · 0 评论 -
java 程序员面试金典 3
1 请设计一个高效的方法,找出任意指定单词在一篇文章中的出现频数。给定一个string数组article和数组大小n及一个待统计单词word,请返回该单词在文章中的出现频数。 保证文章的词数小于等于1000。//法1 :常规对比做法(我的做法)//也想过 用map等集合来统计 ,但是这个查找数据量不大,没必要 import java.util.*;public cl原创 2018-01-05 19:12:45 · 311 阅读 · 0 评论 -
java 程序员面试金典 1
1.请编写一个方法,找出两个数字中最大的那个。条件是不得使用if-else等比较和判断运算符。给定两个int a和b,请返回较大的一个数。若两数相同则返回任意一个。public int getMax(int a,int b){ int c=(a-b)>>31; return a+c*(a-b);}/* c=(a-b)>>31;当a>=b :(a-b)符号位 为0 ,右移原创 2018-01-03 21:47:42 · 347 阅读 · 0 评论 -
java程序员面试金典 2
1. 输入一个链表,输出该链表中倒数第k个结点。public class ListNode{ int val; ListNode next=null; ListNode(int val){ this.val=val; }}public class Solution{ public ListNode findKthT原创 2018-01-04 19:51:04 · 211 阅读 · 1 评论 -
嵌套括号匹配问题/不使用比较运算求出两个数的最大值和最小值问题
package com.duoduo.day329;/** * 如何消除嵌套的括号 并判断正确性 * @author 多多 * */public class Testchange_str { public static void main(String [] args) { String s="(1,(2,3),(4,(5,6),7))"; String result=...原创 2018-03-29 10:09:54 · 303 阅读 · 0 评论 -
PAT 2牛客网 -----输出一定数量区间的素数
2. 令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。输入描述:输入在一行中给出M和N,其间以空格分隔。输出描述:输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。示例1输入5 27输出11 13 17 19 23 29 31 37 41 4347 53 59 61 67 71 73 79 83 ...原创 2018-01-16 20:24:55 · 345 阅读 · 2 评论 -
华为机试小练习
1. 去重+排序问题链接:https://www.nowcoder.com/questionTerminal/3245215fffb84b7b81285493eae92ff0来源:牛客网 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的...原创 2018-08-31 22:33:05 · 776 阅读 · 2 评论 -
leetcode--直线/点 专题
题目1 : 给定一个(x,y)坐标点集 ,求出在一条直线上的点个数最大值Given n points on a 2D plane, find the maximum number of points that lie on the same straight line./** * Definition for a point. * class Point { * int x; *...原创 2018-04-12 13:26:25 · 223 阅读 · 0 评论 -
左 . (进阶)算法---树 专题
二叉树的三种遍历方式(递归/非递归)递归版:非递归版:原创 2018-06-03 19:46:09 · 586 阅读 · 0 评论 -
leetcode--栈
题目1:用栈实现 数字的各种可能计算 (根据顺序)Evaluate the value of an arithmetic expression in Reverse Polish Notation.Valid operators are+,-,*,/. Each operand may be an integer or another expression.Some examples: ["2"...原创 2018-04-12 13:26:14 · 163 阅读 · 0 评论 -
leetcode---树专题
Leetcode——二叉树常考算法整理BFS与DFS常考算法整理Leetcode——回溯法常考算法整理动态规划(Dynamic Programming)算法与LC实例的理解决战Leetcode: easy part(1-50)决战Leetcode: easy part(51-96) 题目1: 求一棵二叉树的最大深度 Given a binary tree...原创 2018-04-12 13:26:30 · 275 阅读 · 0 评论