算法/数据结构
文章平均质量分 82
Happy编程
这个作者很懒,什么都没留下…
展开
-
数据结构与算法_04_回头是岸依好汉(回溯算法)
一、怎么理解回溯算法二、经典应用1、0-1 背包问题2、正则表达式3、八皇后问题回溯算法的理解:回溯算法,顾名思义就是要返回。处理思想有点类似于枚举搜索,当我们要去搜寻一个东西,我们走到了一个岔路口,这时存在多条路可以选择,我们选择其中一条去走,当发现错误了,返回到岔路口继续寻找下一条路继续走。回溯算法的实现:回溯算法非常适合用递归代码实现尽管回溯算法的原理非常简单,但是却可以解决很多问题,比如我们开头提到的深度优先搜索、八皇后、0-1 背包问题、图的着色......原创 2022-06-22 20:47:14 · 125 阅读 · 0 评论 -
数据结构与算法_03_分而治之的分治算法
分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。这个定义看起来有点类似递归的定义。关于分治和递归的区别,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作:分解:将原问题分解成一系列子问题;解决:递归地求...原创 2022-06-21 23:28:10 · 384 阅读 · 0 评论 -
数据结构与算法_02_局部最优的贪心算法
数据结构与算法,系列文章传送地址,请点击本链接。 1.贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 2.贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素。 3.当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。贪心算法原创 2022-06-20 19:37:25 · 475 阅读 · 0 评论 -
数据结构与算法_01_谨慎使用的递归算法
一、如何理解递归递归本身并不好理解,举一个生活中的栗子来理解一下。周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办?于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。但是,前面的人也看不清啊,所以他也问他前面的人。就这样一排一排往前问,直到问到第一排的人,说我在第一排,然后再这样一排一排再把数字传回来。直到你前面的人告诉你他在哪一排,于是你就知道答案了。一个非常标准的递归求解问题的分解过程,去的过程原创 2022-06-12 10:41:35 · 286 阅读 · 0 评论 -
设计模式_spring框架中常用的8种设计模式
spring框架中常用到的8种设计模式清单如下:设计模式使用地方备注工厂模式BeanFactory ApplicationContext单例模式Spring中的Bean代理模式Spring AOPjava反射实现动态代理模板方法模式Spring中以Template结尾的类使用继承的方式实现观察者模式Spring事件驱动模型适配器模式Spring AOP中的AdvisorAdapter Spring MVC中的HandlerAdapter装饰器模式Spring中含有Wrapper和含有Decora原创 2022-06-11 11:24:38 · 12200 阅读 · 0 评论 -
数据结构与算法_10_图
树中的元素我们称为节点,图中的元素我们就叫做顶点(vertex)。从下图中可以看出来,图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫做边(edge)。生活中,我们的微博,微信等社交圈就是一个典型的图结构。我们就拿微信举例子吧。我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好友,对应到图中,就叫做顶点的度(degree),就是跟顶点相连接的边的条数。实际上,微博的社交原创 2022-06-09 22:52:00 · 127 阅读 · 0 评论 -
数据结构与算法_09_堆
一、如何理解“堆”?堆是一种特殊的树,需要满足如下两点要求:1、堆是一个完全二叉树;(完全二叉树要求,除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。)2、堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。(堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值)对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。...原创 2022-06-08 23:27:05 · 626 阅读 · 1 评论 -
数据结构与算法_08_树和二叉树
一、什么是树?树”这种数据结构真的很像我们现实生活中的“树”,这里面每个元素我们叫做“节点”;用来连接相邻节点之间的关系,我们叫做“父子关系”。比如下面这幅图,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫做根节点,也就是图中的节点 E。我们把没有子节点的节点叫做叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。......原创 2022-06-08 20:30:13 · 410 阅读 · 0 评论 -
数据结构与算法_07_散列表
一、散列思想散列表用的就是数组支持按照下标随机访问的时候,时间复杂度是 O(1) 的特性。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查元素时,我们用同样的散列函数,将键值转化数组下标,从对应的数组下标的位置取数据。...原创 2022-06-07 20:20:34 · 604 阅读 · 0 评论 -
数据结构与算法_06_跳表
我们知道,在有序数组中,我们可以通过二分查找,通过O(logn)的时间复杂度快速查找数据,而链表只能从头节点逐一往后遍历。那么有没有一种数据结构能够支持链表的类二分查找效果呢?答案是肯定的,这就是我们今天要讲的,通过跳表来完成。...原创 2022-06-05 09:52:37 · 425 阅读 · 0 评论 -
数据结构与算法_05_队列
队列这个概念非常好理解。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”。我们知道,栈只支持两个基本操作:入栈 push()和出栈 pop()。队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。......原创 2022-06-04 11:14:32 · 161 阅读 · 0 评论 -
数据结构与算法_04_栈
生活中,比如我们在累碟子就是一个典型的栈模式,其特点是:先进后出,后进先出。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构。...原创 2022-06-04 10:45:24 · 127 阅读 · 0 评论 -
数据结构与算法_03_链表
链表是通过指针将一组零散的内存块串联在一起,作为基础的数据结构,我们可以将其与数组进行对比学习,在底层的存储结构上,数组需要一块连续的内存空间来存储,对内存的要求比较高。原创 2022-06-03 15:44:28 · 291 阅读 · 0 评论 -
数据结构与算法_02_数组
一、什么是数组?如何实现随机访问?数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。下面通过通过2组关键词来彻底掌握数组。1、线性表顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。...原创 2022-06-03 09:23:48 · 151 阅读 · 0 评论 -
数据结构与算法_01_时间复杂度和空间复杂度
一、为什么需要复杂度分析?时间、空间复杂度是衡量你编写算法代码执行效率的考量指标。你可能会有些疑惑,我把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小。为什么还要做时间、空间复杂度分析呢?这种分析方法能比我实实在在跑一遍得到的数据更准确吗?很显然这种事后统计的方法时可行的,但是会存在一定的局限性,主要体现在如下几点:...原创 2022-06-03 00:26:08 · 264 阅读 · 1 评论 -
数据结构与算法_合集导航
本系列文章是极客时间王铮老师《数据结构与算法之美》专栏的学习笔记。旨在和大家一起学习和交流。如有疑问,请在下方留言。信息收集不易,请点关注和收藏,防止走失数据结构月算法_01_时间复杂度和空间复杂度数据结构与算法_01_谨慎使用的递归算法常见的十个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树常见的十个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法数据结构和算法思维导图......原创 2022-06-01 23:34:01 · 274 阅读 · 2 评论 -
算法打卡007_深度优先和广度优先搜索
深度优先图示: 广度优先图示: /**伪代码**///结果集合ArrayList visited = new ArrayList();public void dfs(node, visited){ //终止结果 if(visited.contains(node)){ return; } //加入当前节点 visited.add(node); //处理下层 while(node.next != null){ if(!visited.原创 2022-05-31 20:47:19 · 264 阅读 · 0 评论 -
算法打卡006_leetcode169.多数元素
169. 多数元素给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:nums = [3,2,3]输出:3示例 2:输入:nums = [2,2,1,1,1,2,2]输出:2方法一:排序法,由于多数元素出现次数大于n/2,所以排序之后,中间的元素一定是多数元素。class Solution {/**排序法*/public原创 2022-05-30 23:10:59 · 787 阅读 · 1 评论 -
算法打卡005_leetcode_078.子集_50. Pow(x, n)
78. 子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]方法一:递归法从空集开始,一个个把数据往已有结果里面加,直到所有的数据加入完毕。public List<List原创 2022-05-29 21:18:18 · 171 阅读 · 0 评论 -
算法打卡004_递归
目录一、递归代码模板二、思维要点三、示例题目22. 括号生成226. 翻转二叉树98. 验证二叉搜索树一、递归代码模板public void recur(int level,int param) { //终止条件 if(level > MAX_LEVEL){ return; } //处理过程 process(level,param); //下钻 recur(level +原创 2022-05-29 12:22:25 · 98 阅读 · 0 评论 -
算法打卡003_leetCode_213_打家劫舍II&III
213. 打家劫舍 II你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋.原创 2022-05-28 10:13:10 · 84 阅读 · 0 评论 -
算法打卡002_leetcode_198. 打家劫舍
示例 1:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4.原创 2022-05-22 22:21:33 · 74 阅读 · 0 评论 -
算法打卡001
目录1. 两数之和15 .三数之和18. 四数之和题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。相似题目:1 号算法题:两数之和15 号算法题:三数之和18 号算法题:四数之和解法一:暴力解法public int[] twoSum(i..原创 2022-05-09 23:39:10 · 74 阅读 · 0 评论 -
第7周作业1——背包问题
(1)背包问题。对上文中提到的背包问题提供的表1(数据文件下载Knapsack.txt,第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。要求能够把构造的二维表格输出到文件KnapsackResult.txt中.背包问题解决伪代码:控制台实现代码:package seven.suanfa原创 2014-04-23 11:02:42 · 837 阅读 · 0 评论 -
第五周作业——有向图邻接表表示及反向
1. 有向图中反向图构造。对tinyDG.txt(http://pan.baidu.com/s/1o6jWtcA)文件所表示的图,输出其邻接表表示 与 反向图的邻接表表示。类名:GraphReverse。博文标题:第五周作业——有向图邻接表表示及反向图构造邻接表表示示例如下:0:1 51:2:0 3……原创 2014-04-07 13:56:53 · 926 阅读 · 0 评论 -
第四周作业——图的表示
1. 图的表示:给定图数据文件(tinyG.txt),计算得到图的邻接矩阵,并把邻接矩阵保存到文件(tinyG_matrix.txt)中。类名:GraphRepresentation源码:package four.suanfa.whp;import java.io.BufferedReader;import java.io.File;import java.io.FileO原创 2014-04-02 21:55:40 · 827 阅读 · 2 评论 -
第四周作业——无向图的DFS算法
对上面图的DFS算法java代码:(实现遍历的顺序打印,以及判断连通分量的数量)package four.suanfa.whp;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOExc原创 2014-04-03 00:45:18 · 634 阅读 · 0 评论 -
第六周作业1——利用哈夫曼编码英文字母表
1. 哈夫曼编码。对教材P167中习题5.18,思考并完成问题a-d。(下表给出了英文字母(包括用于分割单词的空格)在某文集中的出现频率。空格 18.3% | r 4.8% | y 1.6% e 10.2% | d 3.5% | p 1.6%原创 2014-04-17 21:40:13 · 1177 阅读 · 0 评论 -
第1次实验——NPC问题(回溯算法、聚类分析)
题目:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。原创 2014-06-10 15:54:57 · 1247 阅读 · 0 评论 -
第2次实验——算法基本功 与 综合思考
(1)算法基本功——快速排序 对文件 largeW.txt(下载链接)中的数据,应用快速排序算法进行排序,并与冒泡排序、归并排序进行时间比较。体验算法复杂度对设计算法的影响。原创 2014-06-10 20:14:07 · 1088 阅读 · 0 评论 -
RSA加密算法 公钥(N,e)产生
RSA公钥的产生步骤:1、随机生成两个不同的素数p,q 2、计算出n=(p-1)()package second.suanfa.whp;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Random;public class creat原创 2014-03-19 23:38:05 · 12531 阅读 · 0 评论 -
随机生成一个n bit位的长质数
2.3:随机生成一个n bit位的长质数。函数前面如下 long createRndPrime(int n) 输入:随机质数的bit位长度为n 输出:nbit位长度的质数发现问题:当位数增到40以上后,产生结果的时间明显增大。说明在判断大数是质数时用了比较久的时间package second.suanfa.whp;import java.i原创 2014-03-19 23:37:13 · 1944 阅读 · 0 评论 -
判断一个正整数是不是质数
2.1判断一个正整数是不是质数?package second.suanfa.whp;import java.io.BufferedReader;import java.io.InputStreamReader;public class Isprime { /** * @王海平 */ public static void main(String[] args) { /原创 2014-03-19 23:34:45 · 1476 阅读 · 0 评论 -
有向无环图(DAG)拓扑排序的两种方法
有向无环图的拓扑排序。原创 2014-06-11 16:09:21 · 6819 阅读 · 0 评论 -
随机生成一个n bit位的长整数(随机函数的使用,特定区间随机数的生成方法)
2.2: 随机生成一个n bit位的长整数。函数签名如下 long createRndInteger(int n) 输入:随机数bit位的长度为n(解释:3bit位,则最大为111,最小为100;n bit位,则该数字二进制长度为n) 输出:返回该随机数分析:①首先我们要明确题目中的长整数是无符号长整数还是有符号长整数。下面我们以无符号长整数完成题目。原创 2014-03-19 23:36:14 · 2203 阅读 · 0 评论 -
Fibonacci 0,1,1,2,3,5,8…… 数列的实现
算法,Fibonacci 0,1,1,2,3,5,8…… 数列的实现,不同算法的比较原创 2014-06-04 20:22:36 · 1754 阅读 · 0 评论 -
RSA 公钥 数字签名 dec 的理解,以及对公钥加密和数字签名之间联系的理解
1. 资料阅读。 (20分钟) 查阅 百度百科(http://baike.baidu.com/ )中“RSA”、“数字签名”、“公钥”、“DES”等4个名词的解释。理解 公钥加密 与 数字签名 之间的联系与区别,能够用自己的话阐述两者的概念。我就用自己的话来理解“RSA”、“数字签名”、“公钥”、“DES”,RSA:它是一种非对称的加密算法,通过相应的原理产生一原创 2014-03-20 23:49:04 · 1148 阅读 · 0 评论