算法
文章平均质量分 62
Fairy要carry
欲戴其冠,必承其重
展开
-
协同过滤算法的学习
来阐述:我们去看电影的时候,会经常遇到看什么电影的问题,当看到电影传单上所有的电影时,我们又很难确定看哪个电影,而这个时候我们通常会问朋友或同学,通过去询问或者打听看哪部电影,而通常问的这个朋友或者同学是兴趣爱好相似比较信任的。即当一个用户A需要个性化推荐的时候,我们可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的,而用户A没有听说过的物品推荐给A。记录计算物品之间的相似度,该算法认为,物品a和物品c具有很大的相似度是因为喜欢物品a的用户大都喜欢物品c。rxi的均值表示用户对所有商品的评价的均分。原创 2024-03-25 11:48:48 · 902 阅读 · 0 评论 -
球面余弦定理
然后我们代入两点的经纬度即可。原创 2022-12-26 01:41:35 · 1559 阅读 · 0 评论 -
跳表Skiplist
对于有n个元素的链表,会分成log(n+1),比如下图为四层,最下面是所有元素都有,往上面走隔着空元素越来越少,保证查询效率为logn最关键的就是新插入的节点应该跨越多少层**——>由抛硬币的方式决定,正面就继续抛直至负数为止,每抛一次count++,count为跨越的次数**跳跃表查找次数近似于层数也就是logn插入e,从上到下,找到比e小的最接近的元素,让它指针指向e当然首先是去find寻找e应该在哪个位置,(肯定在最下面那层判断)原创 2022-12-23 18:54:25 · 849 阅读 · 0 评论 -
手写B+树
插入关键字 40 ,按照第 2 种情况将结点分裂,并将关键字 37 上移到父结点,发现父结点 [15、37、44、59] 包含的关键字的个数大于 M ,所以将结点 [15、37、44、59] 分裂为两个结点 [15、37] 和结点 [44、59] ,并将关键字 37 上移到父结点中 [37、59、97] . 父结点包含关键字个数没有超过 M ,插入结束。比如插入关键字 12 ,插入关键字所在的结点的 [10,15] 包含两个关键字,小于 M ,则直接插入关键字 12。B+树插入删除时间复杂度为0(1)原创 2022-12-23 17:10:58 · 4002 阅读 · 0 评论 -
Treap树堆
主要体现的思想是随机插入数字,会给每个数字赋予一个优先级——>目的是让插入的关键字满足二叉树(节点的性质满足=(关键字:优先级))特点:被旋转的节点的左子树会到原父节点的右子树上(节点左旋,那么节点的右子树还是一直挂着保护着的)2.后面发现关键字2的优先级原创 2022-12-23 10:55:31 · 692 阅读 · 0 评论 -
Dijkstra迪杰斯特拉算法
1.战争时期,胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到A, B, C , D, E, F 六个村庄。,通过这个已经访问的顶点集合进行扩散,遍历矩阵中没有访问的,并且动态更新节点之前的距离,最短距离放在。,每个下标对应的值=前一个的顶点下标,比如下面下标为0,对应的值为6说明前一个点的下标为6。2.各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里。强调的是顶点到所有顶点的距离,每个怎么样才能是最短。原创 2022-12-18 02:11:57 · 471 阅读 · 0 评论 -
kruskalCase克鲁斯卡尔算法
它的特点和Prim算法不一样,Prim是以点为主,通过顶点遍历没有访问的节点计算最小权重直至一条最小边出来;而Kruskal算法是以边为主,时间复杂度要低一些0(edge);最小生成树:在一个有n个结点的无向图中选出最少的边,保证所选边权相加之和最小以及该图中依然有n个结点并且n个结点连通。一共有n个结点,要保证连通,至少需要n-1条边。原创 2022-12-16 15:06:27 · 775 阅读 · 0 评论 -
Prim算法
3.进行遍历边,然后两层嵌套——> ** 核心:通过被访问的节点进行扩散访问没有访问过的节点,并比较权重,如果是最小就进行替换minWeight,并记录下标,当一条边的都访问完了,记录一条最短边的权重(此时可能会有其他节点变为以及已经访问的状态) **简而言之,就是先确定顶点,根据顶点得到边上权值最短的节点,然后根据这两个节点遍历得到周围最短的节点,然后不断遍历不断确定。会发现n个点,会有n-1条边,把对应的权重相加就是最短路径(有点贪心算法的思维:每次新的路都选择最短的)2.N个顶点,有N-1条边。原创 2022-12-16 13:51:08 · 543 阅读 · 0 评论 -
并查集引入
比如 union(4,5),4的父节点为3,所以fa[4]=3,fa[3]=2,fa[2]=1,fa[1]=1为结束末尾条件。这个就像一棵树,不像之前的把5的老大从6改为7,那么4的老大原本也是6就会收到影响也为7,因为6被7干掉了,强盗团队-1。上一个版本 我们3干掉了5 3就是5的老大 然后7干掉了3 3的老大和5的老大都变成了7。还不如直接打第3伙 于是第7伙强盗就打赢了第3伙强盗 然后第3伙和第5伙都归第7伙了。这次我们是3干掉了5 3就是5的老大 7干掉了3 3的老大是7 5的老大还是3。原创 2022-12-16 02:39:17 · 287 阅读 · 0 评论 -
拓扑排序结合图实战
1.选择一个入度为0的顶点进行输出2.从网中删除此顶点以及顶点的所有边1.[1,0] 表示想修1课程就需要先修0课程:0—>1,也就是1出现入度+1通过观察可以发现,比如[2,0],想修2需要先修0,2的入度我们判断2出现多少次即可原创 2022-12-04 23:59:05 · 91 阅读 · 0 评论 -
图论的学习
由一系列顶点组成,其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点;4.既存在v->w,也存在w->v,即双向连接;:至少含有一条边,且起点和终点相同的有向路径;**入度:**指向某个顶点的边的个数;2.存在从v到w的边v->w;3.存在从w到v的边w->v;:由某个顶点指出的边的个数;原创 2022-12-01 01:02:11 · 106 阅读 · 0 评论 -
Base64结合密码学x509编码和PKCS#8编码
那么我们取6个比特为一组,计算它的ascii值,得到一个字符,这个字符肯定是可见字符,好,把它对应的字符写出来,再取6个比特,计算…一个xml当中包含另一个xml数据,此时如果将xml数据直接写入显然不合适,将xml进行适当编码存入较为方便,事实上xml当中的字符一般都是可见字符(0-127之间),但是由于中文的存在,可能存在不可见字符,直接将字符打印在外层xml的数据中显然不合理,那么怎么办呢?电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。,这样出错的可能性就大降低了。原创 2022-11-22 13:52:28 · 558 阅读 · 0 评论 -
X509编码和PKCS#8编码对密码的加密解密
X.509 是密码学里公钥证书的格式标准。X.509 证书己应用在包括TLS/SSL(WWW万维网安全浏览的基石)在内的众多 Internet协议里.同时它也用在很多非在线应用场景里,比如电子签名服务。原创 2022-11-22 11:43:37 · 2378 阅读 · 0 评论 -
RSA加密算法
众所周知对称加密是比较垃圾的,之前黑客大赛破解汽车响应就有出现过这样的情况,A去响应B车,B车给A发送一个token,然后A可以根据此token去解密从而开车,但是在发送途中token可能被第三者去抓包得到,而token又是一方发的没有变化所以是不安全的**(对称加密)**1.非对称加密:场景:A去请求B,B会产生一个私钥,并根据计算得到一个公钥(就是对外公开的token),并将公钥响应给A,A这里将信息与A进行加密发送回B,然后B再利用私钥进行解密,这样类似于爱情的双向奔赴,并且各自有各自的能力1.如何得原创 2022-11-22 10:33:04 · 377 阅读 · 0 评论 -
HashMap的getOrDefault方法
Java HashMap getOrDefault() 方法 | 菜鸟教程 (runoob.com)转载 2022-10-22 22:59:57 · 89 阅读 · 0 评论 -
贪心算法的思考
就是对问题求解的时候,能够做出当前。原创 2022-10-09 21:46:06 · 408 阅读 · 0 评论 -
红黑树+AVL+BST
我们展示最差情况——>红黑相间,一边路径是一边路径节点数的两倍,那么层数就是翻倍的,所以时间为2*lognb(nb=1/2n,黑节点至少占一半,所以最差为logn/2)——>logn/2=logn-1——logn。,判断父叔节点,003父为红,叔节点为null(为黑节点)根据图可知类型是右右(根据爷爷节点与当前节点路径判断),可知操作时左旋+变色,003左旋将002提上去作为root,001变为002的左节点。,判断父节点和叔节点,由上述图可知,父为黑节点就无需任何操作了,是插入所以002为红色。原创 2022-10-09 01:00:06 · 280 阅读 · 0 评论 -
(补)B+树一些思想
我们索引一般是6bit,主键的话假如是bigint,8bit,然后我们的键和指针的关系是n-n+1的关系(图上很明显),然后我们一个数据页是16kb,1kb=1024bit,所以说——>n*8+(n-1)*6=16*1024。将我们的键计算hash,判断落在我们hash表上哪个Entry上,当然会出现哈希冲突——>利用我们的一个链表来解决我们的哈希冲突,像我们自定义的hash算法h^h>>>16也缓解了我们的哈希冲突。1.根据主键查询效率要高一些,一次查询即可,直接查主键一级索引树。开门见山,我们所有的。原创 2022-09-24 21:36:12 · 529 阅读 · 0 评论 -
反转类型的题目
—>3.node只是当前方法中递归返回的节点,也就是个末尾节点——>4.我们利用当前head.next.next=head进行调换位置,当前节点head=null,返回node。虚拟一个头节点,然后每进一次循环定义一个next后继节点,然后对当前节点进行操作——>cur.next=pre ,pre=cur, cur=next返回pre即可。1.首先确立base,head.next==null||head==null——>2.进入递归框架直至最后一个节点node。原创 2022-09-24 16:46:20 · 496 阅读 · 0 评论 -
算法-二叉树
思想首先是要明白二叉树操作的位置,其实可以看出这就是前序后序两种操作——>对应在我们的排序算法中不难想到,首先是快排,若要对进行排序,我们p,通过交换元素使得都小于等于nums[p],且都大于nums[p],,最后整个数组就被排序了归并排序,要对进行排序,我们先对排序,再对排序,最后把这两个有序的子数组合并,整个数组就排好序了,我们可以利用回溯思路进行处理首先分析当前节点左右子树是否为null,为null说明到达叶子节点,当前节点已到最大深度然后进行递归左右子树得到最大深度之后进行回溯。原创 2022-09-22 20:50:55 · 327 阅读 · 0 评论 -
BFS思想
已知先0000开始得到target,0000为root加入队列,然后字符串有8种变化(四个位置每个位置能+-,注意0-1=9,9+1=0),所以需要两层循环,一个是队列的字符串一个是每个字符串的演变。,你要找到最短路径,肯定得把二叉树中所有树杈都探索完才能对比出最短的路径有多长对不对?一般就是查起点到终点最短路径这种,这种问题可以做很多衍生——>比如最少次数,最少步数,最少替换次数等等,一般就是用于最少的问题上。,这保证了第一次到达终点的时候,走的步数是最少的。首先,你看 BFS 的逻辑,depth。原创 2022-09-21 23:35:14 · 316 阅读 · 0 评论 -
Java实现归并排序
拆分数组归并排序,直到拆分到区间里只剩下一个元素的时候。不能再拆分的时候。这个时候我们,得到长度更长的有序数组。当前合并好的有序数组为下一轮得到更长的有序数组做好了准备。转载 2022-09-21 00:54:18 · 226 阅读 · 0 评论 -
递归回溯实战+思想
1.根据题意找到base case——>2.然后遍历提供的数据节点,——>3.我们利用boolean数据进行判断,当前数据节点是否选择,如果选择过直接continue——>4.没有选择过进行选择逻辑并且修改状态——>5.进入递归函数——>6.回溯,撤销逻辑选择和上述思路差不多,加了一个剪枝操作,因为提供的元素有重复打个比方就以为例,为了区别两个2是不同元素,后面我们写作——>显然,两条值相同的相邻树枝会产生重复比如输入,2'只有在2已经被使用的情况下才会被选择,同理,2''2'原创 2022-09-19 01:34:01 · 176 阅读 · 0 评论 -
对Redis布隆过滤器的实现
非常关键在这里,计算key的hash值后,然后^key的hash>>>16,目的是保留key的特点,保证散列均匀,因为size-1-i(像hashMap默认size为16,那么15对应的二进制为1111,那么就只能与hash的低位四个进行运算,那么保留特点就很少),所以>>>16保留了key hash低位16的特点,然后再^key.hashCode()->保证了高位16的特点(这样就保证了key的特点)计算key的hash(利用辅助hash数组对key进行多次hash),得到位置index后放入数组。原创 2022-09-07 10:12:54 · 522 阅读 · 0 评论 -
动态规划复习
1.首先找到子问题的结束状态(base case)——>2.状态转移方程,根据最佳子问题递推得到父问题——>3.引入备忘录,初始化备忘录,对其判断,如果里面有值就直接返回备忘录中的值,而不用继续向下递归了,从而达到。其实就是递归+备忘录·——>因为像我们递归的话只要有一条路重复,那么肯定就会出现非常多的重复问题(幂次方)会被多次计算,所以一定存在重叠子问题。显然有两种路径,可以是。......原创 2022-08-27 15:12:33 · 161 阅读 · 1 评论 -
Java优先队列PriorityQueue认识
类及其迭代器实现Collection和Iterator接口的所有可选方法。方法iterator()中提供的迭代器不能保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。请注意,此实现不同步。如果任何线程修改队列,多线程不应同时访问PriorityQueue实例。而是使用线程安全的PriorityBlockingQueue类。基本数据类型的包装类(如:Integer,Long等)函数删除指定元素,先根据indexOf。函数获取元素的下标...转载 2022-08-18 11:45:38 · 360 阅读 · 0 评论 -
集合-实习猎杀面试管(小撕源码)
java中实现的。源码如下记住这个intexpectedModCount=modCount,每次创建interator时候都会保存新建该对象对应的modCount。原创 2022-07-22 01:50:49 · 245 阅读 · 0 评论 -
leetcode-09(下一个排列+快乐数+全排列)
我们希望下一个数比当前数大,所以我们只需要将后面的大数与前面的小数交换即可,另外,增加的幅度要是最小,满足紧密排列。交换,所以这里思路是先循环找到>低位的低位位置,然后再来个循环从右边遍历,进行交换;所以我们需要从右往左进行低位交换,比如123465,下一个排列应该把。(需要考虑交换后,低位后面的数是一个降序的数,毕竟小的放后面了)交换完后,还需要考虑低位后的字串情况,可能是个降序的,比如。首先从后向前查找第一个相邻升序的元素对。(从后面再遍历找到大于低位的值),首先按照上一步,交换。...原创 2022-07-21 11:39:05 · 107 阅读 · 0 评论 -
leetcode-08
代码】leetcode-08。原创 2022-07-17 10:20:48 · 113 阅读 · 0 评论 -
leetcode7-dfs+动态规划+双指针
感染函数其实就是一个递归标注的过程,它会将所有相连的1都标注成2。这样就避免了遍历过程中的重复计数的情况,一个岛所有的1都变成了2后,遍历的时候就不会重复遍历了。建议没想明白的同学画个图看看。思路遍历岛这个二维数组,如果当前数为1,则进入感染函数并将岛个数+1。...原创 2022-07-17 01:44:22 · 176 阅读 · 0 评论 -
leetcode06(暴力树+二叉树性质)
目录一道二叉树搜索题寻找共同祖先二叉树中序前序后序遍历两天没刷一下落下四道关键在于左子树只包含小于它的,右子树只包含大于他的,我们可以利用它的性质,定义一个max和一个min,然后根据root的val值进行局部划分,也就是递归,当左边右边都满足时,说明为true寻找共同祖先这题直接暴力,寻找p,q两个节点的共同祖先,我们可以从root下手 ,while循环进行遍历,只要不等于pq两个目标节点就一直循环,如果大于root,root节点就右移,否则左移,中途节点全部加入list中,直至找到pq节点为止原创 2022-07-13 01:44:21 · 127 阅读 · 0 评论 -
leetcode5
BFS 的使用场景总结:层序遍历、最短路径问题 - 二叉树的层序遍历 - 力扣(LeetCode)注意:在while循环的每一轮,都是将当前层的所有节点出队列,再将下一层的所有节点入队列,从而实现层序遍历细节点:while循环每次遍历需要判断队列中的节点数量,因为要将里面的元素poll出来才能放入新的元素;for循环时是将queue中节点poll,然后根据这个poll出来的节点,将他的子节点add...原创 2022-07-10 18:32:05 · 197 阅读 · 0 评论 -
今日leetcode(回顾树)
(28条消息) Java实现二叉树的前序,中序,后序遍历(迭代,递归两种方法实现)_征途远方的博客-CSDN博客_java二叉树的先序,中序,后序遍历 这里用的DFS原创 2022-07-08 16:57:55 · 114 阅读 · 0 评论 -
leetcode-03
快慢指针环形链表->快慢指针+ 逻辑计算:首先快慢指针确定是否有环,此时快慢指针位置一定在环中,我们可以再定义一个头指针,然后与慢指针位移,相同则为入口; 动态规划思想:首先确定当下买入的最小值和最小利润,然后每过一天去顶当天买入的股票与昨天的差与之前我们的最小利润作对比得到最大利润;并且每天得到相比之前最小的买入值 首先分为大写和小写两种,然后将字符串中字符添加进去,每出现一次,对应位置值++统计次数:如果为偶数次,+sum,如果为奇数则不计,在最后判断长度,看是奇数还是偶数长度再判断是原创 2022-07-07 12:36:15 · 132 阅读 · 0 评论 -
leetcode-02(链表题)
迭代法:思路:划分一个局部位置,然后用一个辅助节点和辅助指针,比较大小然后辅助指针去连即可,每连一次位置往后推;递归解法 递归解法,与上提类似 迭代法注意指针的利用指向head,然后指向前一个结点,慢慢往后推快慢指针:...原创 2022-07-06 11:37:41 · 166 阅读 · 0 评论 -
leetcode
动态规划: (26条消息) 告别动态规划,连刷40道动规算法题,我总结了动规的套路_Hollis Chuang的博客-CSDN博客 3个步骤——>意思就是定义历史记录,记录我们曾经的计算,这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存。下面我们先来讲下做动态规划题很重要的三个步骤。第一步骤:定义数组元素的含义,上面说了,我们会用一个数组,来保存历史数组,假设用一维数组 dp[] 吧。这个时候有一个非常非常重要的点,就是规定你这个数组元素的含义,例如你的 dp[i] 是代表什么意思原创 2022-07-05 19:02:38 · 1340 阅读 · 0 评论