数据结构与算法
文章平均质量分 62
rabbit_geek
后端工程师,使用kotlin、java、python、go语言进行开发
展开
-
java中 == equals和hashcode总结(面试必问)
equals和==的区别重写equals为什么要重写hashcode()方法原创 2022-03-24 20:44:00 · 393 阅读 · 0 评论 -
插入排序与循环不变式(算法导论)
首先介绍插入排序插入排序的名字很形象,这个算法就是从数组的第二位开始(此时第一位只有一位,视为排好序的子数组)一直到数组的最后一位,一位一位地将数加入到已经排好序的子数组中。插入排序的初始状态,可以想象你手里有一张牌,这就是数组 0 位置的牌,从位置1到数组结束的所有数都是在桌子上放着的牌,你的目的就是把这些牌都拿到手里并排好序。伪代码: for j=2 to a.length key=a[j] i=j-1 while i>0 and a[i]>key a[i+1]=a原创 2021-02-18 23:51:58 · 517 阅读 · 0 评论 -
Hill密码(希尔密码)
Hill密码(希尔密码)希尔密码可以防止频率分析攻击(因为运用的是矩阵,可能密文中同一个字母翻译成明文是不一样的)希尔密码隐藏了单字母的频率字母和数字的对应可以修改成其他方案抵抗频率攻击易受已知明文的攻击希尔密码的加密过程:1.准备一个n*n的可逆矩阵 E(即密钥)2.将a-z 对应0-25编码3.将要加密的一串字母当作n维度向量,比如矩阵E的大小是3*3,那么abcde就可以分为 abc de 转为数字就是012 340(不足n位补0)4.密文(数字列向量)=(E*明原创 2020-12-18 15:30:50 · 5345 阅读 · 4 评论 -
仿射加密(java)
仿射加密的加密过程是一个线性变换:在仿射加密中,可设0-25对应 'a '-‘z’ 这26个字母。设y为密文,x为明文,则:y(x)=(k1x+k2) mod 26并且要求gcd(k1,26)=1;(即k1与26的最大公约数为1)要求k1和26互素,不然y(x)就不是一个单射函数在求解仿射解密函数时,需要求k1在Z26上的乘法逆元a-1∈Z26,这可由扩展欧几里得算法求解解密 x=( (k1-1)(y(x)-k2) )%26下面是仿射加密的java实现:(附有注释)KeyInput原创 2020-12-18 13:30:52 · 902 阅读 · 0 评论 -
四种队列解析总结
队列是一种特殊的线性表。只允许在表的前端进行删除操作,在表的后端进行插入操作。1.普通队列举例:import java.util.LinkedList;import java.util.Queue; public class Main { public static void main(String[] args) { //add()和remove()方法在失败的时候会抛出异常(不推荐) Queue<String>原创 2020-06-24 01:01:25 · 892 阅读 · 0 评论 -
链表(单/双/单循环/双循环)
文中链接附上java版代码1.单链表单链表是一种链式存储的数据结构,方便插入/删除数据元素,对比数组,在进行插入删除等操作时,更节省空间。单链表中每一个结点的构成都是由数据元素+指针构成的2.单循环链表单循环链表与单链表的区别就是,单循环链表的尾指针指向头结点,可以想象成一个环,首尾相连,这时候需要考虑两种情况:1.不带头结点2.带头节点不带头节点的情况:对比单链表,直接尾结点的指针指向头节点就好了带头节点的情况:尾结点指向头结点的下一个结点,头结点不保存数据。3.双链表:顾名思义,原创 2020-06-24 00:59:14 · 2962 阅读 · 0 评论 -
数据结构之哈希表(散列表)
本文附带部分leetcode的例题和伪代码哈希表哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数(哈希函数)转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,原创 2020-06-24 00:57:41 · 878 阅读 · 0 评论 -
插入排序以及分析(JAVA)
插入排序对于少量元素的排序,插入排序是一个有效的算法插入排序的基本思想:是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表附代码(用了单例模式,因为这个类是为了算法算法性能的内部分析的程序做的)代码分析了移动和比较次数时间复杂度:这个算法如果不在内部统计比较和移动的次数,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为 O[N] 但是由于我们要在内部计数,实际上得到的时间复杂度还是O[N],原创 2020-06-08 15:51:48 · 124 阅读 · 0 评论 -
选择排序以及分析(JAVA)
选择排序基本思想:从左到右遍历数组,找出最小/大的放在左侧与left所标志的位置交换元素,即第一次将数组中最小(或者最大)的元素置顶(数组下标为0的位置);然后从此数组下标为0的位置向右找最小(或者最大)的元素与下标为1的位置交换,以此类推复杂度最差情况:进行比较操作的时间复杂度为O(n^2),进行移动操作的时间复杂度为O(n)选择排序是不稳定的排序算法代码:使用了单例模式,方便在程序内部比较不同算法的移动/比较次数,不需要的删掉就可以代码中in_order(List list, b原创 2020-06-08 15:47:21 · 96 阅读 · 0 评论 -
归并排序及分析(JAVA)
归并排序归并排序是递归的分治算法分治分治的思想是把一个复杂的问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解;比如快排、归并排序 傅里叶变换等分治策略:对于一个规模为n的问题,若该问题可以容易的解决(比如规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解。复杂度由于归并排序每次划分时两个子序列的长度基本一样,所以归并排序最好、最差和平均时间原创 2020-06-08 15:40:45 · 111 阅读 · 0 评论 -
冒泡排序以及复杂度分析(JAVA)
冒泡排序(JAVA)冒泡排序算法的原理如下: [1]比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。冒泡排序是一种非常经典的算法,易于理解而且容易实现。复杂度:若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数和记录移动次数均达到最小值(原创 2020-06-08 15:34:35 · 1445 阅读 · 0 评论 -
(Java)哈夫曼编码译码器-压缩/解压缩编码
哈夫曼编码译码器仅供学习和参考,这份代码的算法和文件操作都参考了许多文章。仅供学习和参考,这份代码的算法和文件操作都参考了许多文章。仅供学习和参考,这份代码的算法和文件操作都参考了许多文章。1. 选择需要进行编码的文件2.建立哈夫曼树3.建立密码本并对文件编码4.选择需要进行解码的文件并解码5.按位压缩方式对文件进行压缩6.解压压缩文件为编码文件一共三个类,Huffman类也是程序的入口下面的代码中注释将对代码有详细的讲解public class Node<T> {//第原创 2020-05-08 21:10:58 · 1219 阅读 · 2 评论