
算法
文章平均质量分 94
算法
01Byte空间
做过开发,创过业,踩过坑。从Java后台开发,PL/SQL开发,Pro*C开发,到shell脚本,再到兼职开发的MySQL DBA。
为人友善诚恳,工作踏实,吃苦耐劳,富有朝气,激情,以及团队合作意识。
专注后端技术:Java、Shell、Socket、MySQL、Oracle、Linux、中间件、分布式、微服务。偶尔扯扯淡、分享技术干货。
https://github.com/zhouxx1055
https://zhouxx.blog.youkuaiyun.com/
展开
-
科普文:Java基础之算法系列【链表之缓存:2Q(Two Queues)两队缓存替换算法详解】
2Q缓存实现:结合FIFO队列和LRU队列的缓存替换策略。* 适用场景:存在短期重复访问的数据(如Web请求路径缓存)* - 淘汰时优先淘汰FIFO队列中的旧数据。* - 二次命中后晋升到LRU队列。* - 新数据进入FIFO队列。FIFO、LRU实现方式。LRU实现方式二: 。对于高并发场景,可将。实现更细粒度的锁控制。原创 2025-04-20 15:27:56 · 1010 阅读 · 0 评论 -
科普文:Java基础之算法系列【链表之缓存:ARC(Adaptive Replacement Cache)自适应替换缓存算法详解】
结合 LFUCacheWithHeap(LFU) 和 DynamicLRUCacheWithSkipList(LRU) 实现 ARC(Adaptive Replacement Cache) 算法的完整代码。详细参见前面LRU和LFU的文章。即通过结合 跳表(LRU) 和 最小堆(LFU) 的优势,该实现能在保证并发安全性的同时,动态适应不同的数据访问模式,是 ARC 算法的高效工程实践。* ARC(自适应替换缓存)实现:* - T1(LRU列表):用跳表维护最近访问数据*原创 2025-04-20 14:53:14 · 777 阅读 · 0 评论 -
科普文:Java基础之算法系列【链表之缓存:LFU(Least Frequently Used)最不经常使用算法详解】
LFU实现方式一: TreeMap + 哈希表+synchronizedLFU实现方式二: 最小堆 + 哈希表+ReentrantReadWriteLockLFU(Least Frequently Used):概念:最不经常使用算法。原理:记录每个缓存项的使用频率,定期清除使用频率最低的项。优点:适用于那些有部分热点数据的场景,因为这些热点数据会被频繁访问,从而kromah地留在缓存中。缺点:实现相对复杂,需要维护频率计数器;对于一些突发性的高频访问,LFU可能会频繁地替换缓存项。原创 2025-04-20 13:41:48 · 890 阅读 · 0 评论 -
科普文:Java基础之算法系列【链表之缓存:LRU(Least Recently Used):最近最少使用算法详解】
LRU实现方式一: 双向链表 + 哈希表+读写锁LRU实现方式二: 跳表 + 哈希表+分段锁最近最少使用算法(Least Recently used -LRU):这个缓存算法将最近使用的条目存放到靠近缓存顶部的位置。当一个新条目被访问时,LRU将它放置到缓存的顶部。当缓存达到极限时,较早之前访问的条目将从缓存底部开始被移除。原创 2025-04-20 13:12:34 · 621 阅读 · 0 评论 -
科普文:Java基础之算法系列【链表之缓存:三种方式实现FIFO】
概念:先进先出算法。原理:按照缓存项的进入时间顺序进行替换,最早进入的项会被优先移出。优点:实现简单,不需要额外的记录结构。缺点:无法区分不同项的重要性,可能会导致热点数据被移出,影响缓存性能。记住它的核心原则:如果一个数据最先进入缓存,则应该最早淘汰掉。下面用三种方式来实现FIFO:实现方式 插入/淘汰时间复杂度 内存占用双向链表 + 哈希表 O(1) 较高队列 + 哈希表 O(1) 较低LinkedHashMap O(1) 最低原创 2025-04-20 11:29:41 · 937 阅读 · 0 评论 -
科普文:Java基础之算法系列【链表之缓存:LRU、LFU、FIFO、ARC、MRU、2Q、OPT、NRU概叙】
这里我们从算法和数据结构出发,整理几种常见的缓存替换算法,包括LRU、LFU、FIFO、ARC、MRU、2Q、OPT和NRU。每种缓存替换算法都有其独特的优缺点和适用场景。选择哪种算法取决于具体的应用需求和工作负载特性。例如,对于有明显热点数据且需要频繁访问的场景,LFU可能更适合;而对于需要抵御扫描型工作负载的应用,ARC可能是更好的选择。理解这些算法的原理和特性,有助于在实际应用中做出更合理的选择和优化。原创 2025-04-20 00:34:41 · 629 阅读 · 0 评论 -
科普文:算法和数据结构系列【死磕字典树:字典树的升级版三叉树Ternary Search Tree优化】
优化方向 节省空间: 压缩字典树,但是维护成本更高; 三分搜索树压缩前缀树:合并只有一个子节点的节点,可以减少内存使用。Ternary Search Tree:每个节点有三个子节点,可以在某些情况下提供更好的平衡。使用哈希表:在每个节点使用哈希表而不是数组来存储子节点,可以处理更大的字符集。Ternary Search Tree三叉树如何优化字典树?Ternary Search Tree(三元搜索树)是一种高效的数据结构,用于存储和检索字符串集合。与字典树(Trie)相比,三元搜索树在某些方原创 2025-01-18 12:28:28 · 1085 阅读 · 0 评论 -
科普文:算法和数据结构系列【死磕字典树:来一个英文字母游戏】
前面我们实现了一个简单的字典树,这里我们做一个改进,完成一个字典游戏,输出类似九宫格的字母表,看谁拼接的单词多。效果如下:有如上三句英文,每句话都是涵盖了26个英文字母,三句话分别用了33、32、31个字母,完成了用26个字母组成的语句。这3句话是一个包含了英文字母表中26字母(不区分大小写)的英文句子.返回提词板:随机输出5*5的字母板,用于提示。拼单词:从上面提词板中,尽可能多的拼词,看谁更厉害??原创 2025-01-18 12:11:36 · 344 阅读 · 0 评论 -
科普文:算法和数据结构系列【高效的字符串检索结构:字典树Trie树原理、应用及其java示例代码解读】
今天我们再来看一种树型结构:字典树又名前缀树、单词查找树、Trie树,是哈希树的变种,是一种存储大量字符串的树形数据结构,相比于HashMap存储,在存储单词(和语种无关,任意语言都可以)的场景上,节省了大量的内存空间。注意事项:实现时需要考虑内存使用,避免浪费空间。优化方向 节省空间: 压缩字典树,但是维护成本更高; 三分搜索树压缩前缀树:合并只有一个子节点的节点,可以减少内存使用。Ternary Search Tree:每个节点有三个子节点,可以在某些情况下提供更好的平衡。原创 2025-01-18 11:38:22 · 872 阅读 · 0 评论 -
科普文:计算机系列【计算机网络四万字系统整理】作者|杨欣锐
(1)首先我们要简单了解计网发展历史以及一些基本概念如因特网、网络服务提供者等的含义。因特网Internet:全球范围内的计算机网络的集合,它连接了数以亿计的设备,包括个人计算机、服务器、路由器、交换机、智能手机等,使它们可以相互通信和交换数据。网络服务提供者ISP(Internet Service Provider):通过物理方式(如光纤、DSL、电缆等)将用户设备连接到互联网,并提供连接用户到互联网的一系列服务的公司或组织。这些服务可能包括互联网接入、网络托管、域名注册、虚拟主机、云存储等。原创 2025-01-15 14:51:24 · 790 阅读 · 0 评论 -
科普文:算法和数据结构系列【数据结构(一)从绪论到各种线性表】作者|杨欣锐
在 C++ 编程的广阔领域中,数据结构是理解和实现高效、可维护程序的核心。数据结构是计算机存储、组织数据的方式,它们使得数据访问和修改操作更加高效。本文将带您走进 C++ 中几种常见且重要的数据结构,了解它们的基本概念、特性以及如何在程序中应用。(1)数据结构是计算机科学中的一个分支,它。:组成数据的有一定意义的,也被称为记录。:数据不可分割的,一个数据元素可以由若干个数据项组成。:性质相同的数据元素的集合,数据的子集。:不同数据元素之间非独立而是存在特定的关系。(2)逻辑结构(数据元素之间的相互关系)原创 2025-01-15 14:47:03 · 799 阅读 · 0 评论 -
科普文:算法和数据结构系列【数据结构(二)从树到图】作者|杨欣锐
图Graph1、基本概念(1)图是由数据元素即顶点(Vertex)的有穷非空集合和逻辑关系即顶点之间的边(Edge)的集合组成的,通常表示为G(V,E),其中G表示—个图,V是图G中顶点的集合,E是图G中边的集合。(2)无向图:边无方向,用无序偶对(vi,vj)表示,如下左图表示为{(A,B),(B,C),(C,D),(D,A),(A,C)}。(3)有向图:边有方向,用有序偶对 表示,vi表示弧尾(Tail),vj表示弧头(Head),弧的连线箭头方向是从尾到头,原创 2025-01-15 14:45:03 · 820 阅读 · 0 评论 -
科普文:算法和数据结构系列【非线性结构:树、森林、图概叙】
为了更好的理解图算法,我们先小结一下树、森林、图这三种数据结构。树:n(n≥1)个节点的有限集,n = 0时称为空树,且其内部各子树间没有交叉(没有公用节点)。树也是一种特殊的图,它满足以下条件:树是连通的无圈图,即树中的任意两个顶点之间都存在唯一一条路径,并且树中没有回路。所以树是图的一种,树和图的区别就在于:树是没有环的,而图是可以有环的。图:由顶点和边组成,顶点之间通过边相连。是比树和森林更加复杂的数据结构,万物皆可图。与树和森林不同,图中的顶点之间的关系是任意的,任何两个顶点都转载 2025-01-15 14:20:46 · 1028 阅读 · 0 评论 -
科普文:算法和数据结构系列【压缩和通信利器:哈夫曼树(Huffman Tree)java示例代码解读】
HuffmanTree类// 构建哈夫曼树:根据字符及其频率构建哈夫曼树。使用优先队列(最小堆)来选择权重最小的两个节点进行合并,直到队列中只剩下一个节点,即哈夫曼树的根节点。i < size;i++) {// 生成哈夫曼编码:递归地生成每个字符的哈夫曼编码。左子树路径为"0",右子树路径为"1"。return;// 解码:根据哈夫曼树解码编码字符串。从根节点开始,根据编码的每一位选择左子节点或右子节点,直到到达叶子节点,然后输出对应的字符并回到根节点。原创 2025-01-14 20:49:43 · 897 阅读 · 1 评论 -
科普文:算法和数据结构系列【B+树java示例代码解读】
findKey:在节点x中查找关键字k的索引。findChild:确定在节点x中应该访问哪个子节点来继续搜索关键字k。getPredecessor:找到给定节点x的前驱节点,即子树中的最大节点。fill:当某个节点的键值数量小于t时,调用此方法来恢复其键值数量。borrowFromPrev和borrowFromNext方法:这两个方法应该实现从相邻兄弟节点借用键值的逻辑。merge方法:将当前子节点与其后一个兄弟节点合并。原创 2025-01-14 15:33:03 · 1105 阅读 · 0 评论 -
科普文:算法和数据结构系列【数据库喜欢的数据结构:B-树、B+树原理、应用、以及java实现示例】
为啥数据库没有采用这些数据结构?数据库没有采用大顶堆/小顶堆,AVL树、红黑树,而是选择平衡树的变种多路搜索平衡树BTree(B-Tree,B+Tree),主要原因是IO,未来当IO不再是瓶颈时,未尝不可采用这些结果来处理数据。IO(Input/Output)操作是指从磁盘中读取或写入数据的过程。IO操作是数据库性能的瓶颈之一,因为相对于内存来说,磁盘的读写速度较慢,每次进行IO操作都需要耗费时间和资源。因此在数据库中,只有尽量减少IO操作的次数,才能更好的提高数据库性能。为了达到这个目的通常采用分块原创 2025-01-14 13:23:23 · 769 阅读 · 0 评论 -
科普文:算法和数据结构系列【二叉树总结-下篇:满二叉树、完全二叉树、大顶堆/小顶堆、二叉搜索树、自平衡二叉树、红黑树总结】
从前面的二叉树、满二叉树、完全二叉树、可以看到,这些树结构到最后的大顶堆/小顶堆、AVL树和红黑树,我们日常真正在用的数据结构就是大顶堆/小顶堆、AVL树和红黑树,这后面隐藏着一个现象就是:树都会向有序性、平衡性发展。为什么要追求有序性和平衡性?树追求有序性和平衡性主要是为了提高数据存取的效率、保持结构的稳定性。因为树天生的缺陷:因深度过大导致操作效率降低,因此要求我们在使用树时,需避免树退化为链表,保持树的平衡性。而有序性使得操作可以遵循一定的规则进行,提高查找效率(搜索树的任何一颗子树都满原创 2025-01-13 18:26:38 · 1264 阅读 · 0 评论 -
科普文:算法和数据结构系列【二叉树总结-上篇:满二叉树、完全二叉树、大顶堆/小顶堆、二叉搜索树、自平衡二叉树、红黑树总结】
这张图基本能反映出树、二叉树、完全二叉树、堆(大顶堆/小顶堆)、搜索树、平this(null);/***/// 抽象方法,具体实现由子类提供/*** 遍历* 深度优先遍历(Depth First Search, DFS):深度优先遍历是一个递归的过程,从树的根节点开始,沿着树的深度方向一直遍历到叶节点,然后回溯到父节点,再继续遍历其他未访问的子节点。* 深度优先遍历有三种具体的遍历方式:* 前序遍历(先访问根节点,再访问左子树,最后访问右子树)、* 中序遍历(先访问左子树,再访问根节点,最后访问右子树)原创 2025-01-13 00:15:00 · 888 阅读 · 0 评论 -
科普文:算法和数据结构系列【树:4叉树、N叉树】
树的定义:树是由n(n>=0)个元素节点组成的有限集合,当n=0时,称为空树。对于非空树应满足以下要求:(1)有且仅有一个根节点;(2)当n>1时,其余节点可分成m(m>=0)个互不相交的有限集合,其中每一个集合本身又是一棵树,称为根的子树。从定义中我们可以得到以下结论:1)树是分支分层结构;2)树中仅有根节点没有父节点;3)除根节点外,其余节点有且仅有一个父节点;4)树中每个节点,可以有零个或多个子节点;5)根节点到任何除自身之外的节点,有且仅有一条路径;原创 2025-01-11 17:46:59 · 867 阅读 · 0 评论 -
科普文:算法和数据结构系列【查找算法:常见7种查找算法的原理、应用、以及java实现】
前面梳理完10种排序算法,我们再看看常用的7种查找算法:线性查找、二分查找、二叉搜索树查找、插值查找、斐波那契查找、哈希查找、分块查找等。搜索前,排序的重要性:除了线性查找和哈希查找,其他五种查找算法,均要求有序;否则找不到数据。原创 2025-01-08 21:25:13 · 1379 阅读 · 0 评论 -
科普文:算法和数据结构系列【排序算法:常见10种排序算法的原理、应用、以及java实现】
每种算法都有其特定的应用场景和性能特点,选择合适的排序算法可以提高程序的效率和性能。冒泡排序、选择排序和插入排序:比较简单直观,但效率相对较低,适用于小规模数据排序。快速排序、归并排序和堆排序:平均时间复杂度较低,适用于大规模数据排序。希尔排序:插入排序的一种改进版,在一定程度上提高了插入排序的效率。计数排序、桶排序和基数排序:针对特定数据分布的排序算法,在满足一定条件下可以达到线性时间复杂度。原创 2025-01-08 18:46:45 · 933 阅读 · 0 评论 -
科普文:算法和数据结构系列【JDK自带的数据结构汇总:java.util.*】
在Java Development Kit(JDK)中,提供了多种内置的数据结构,这些数据结构位于java.util.*包和其他相关包中。下面是对JDK中常见数据结构的简要说明:数组、链表、栈、队列、树、堆、图、哈希表等常用数据结构的操作类。图(Graph)在Java的java.util包中,虽然没有直接以“图”命名的类或接口来表示图结构,但图结构在计算机科学和网络科学中被广泛应用,并且可以通过自定义类来实现。图由节点(顶点)和边组成,节点表示实体,边表示实体之间的关系。图可以用来描述各种复杂的关原创 2025-01-07 14:54:30 · 884 阅读 · 0 评论 -
科普文:算法和数据结构系列【非线性数据结构:图Graph的原理、应用、以及java实现】
图(Graph)图是一个二元组G=(V(G),E(G))。其中V(G)是非空集,称为点集,对于V中的每个元素,我们称其为顶点或节点,简称点;E(G)为V(G)各节点之间边的集合,称为边集。常用G=(V,E)表示图。定义:图由顶点(Vertex)和边(Edge)组成,用于表示实体之间的连接关系。基本术语:包括顶点、边、路径、度、入度、出度等。分类:无向图、有向图、完全图、加权图、稀疏图、稠密图等。图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),其中G表示一原创 2025-01-07 13:29:46 · 949 阅读 · 0 评论 -
科普文:算法和数据结构系列【非线性数据结构:树Tree和堆Heap的原理、应用、以及java实现】
5. 树:一种层次结构的数据结构,如二叉树、红黑树等。(已梳理)6. 堆(树):一种特殊的树形数据结构。堆通常被实现为完全二叉树,并满足堆性质:即子结点的键值或索引总是小于(或大于)它的父结点。如:最大堆、最小堆。(已梳理)7. 图:一种表示实体及其关系的数据结构。(未梳理)原创 2025-01-07 12:29:33 · 809 阅读 · 0 评论 -
科普文:算法和数据结构系列【非线性数据结构:哈希表和位图的原理、应用、以及java实现】
在这里我们继续看看哈希表和位图。哈希表和位图是两种常见的数据结构,它们在处理数据时有各自独特的特点和用途。哈希表:也叫散列表,是一种根据关键码值(Key value)直接进行访问的数据结构。它通过哈希函数将键(Key)映射到表中的一个位置来访问记录,以此来加快查找的速度。位图:位图(Bitmap或位数组)是一种简单的数据结构=数组(哈希桶)+哈希函数hash,表示一组位,其中每个位可以是0或1。位图广泛用于计算机系统中,用于内存分配、图像存储和表示集合等任务。原创 2025-01-07 09:36:00 · 882 阅读 · 0 评论 -
科普文:算法和数据结构系列【线性数据结构:栈和队列的原理、应用、以及java实现】
继续梳理线性数据结构:栈和队列。栈是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。它只允许在一端(称为栈顶)进行插入和删除操作。队列是一种线性数据结构,遵循先进先出(FIFO, First In First Out)的原则。它在一端进行插入操作(称为入队,Enqueue),在另一端进行删除操作(称为出队,Dequeue)。原创 2025-01-07 07:42:09 · 768 阅读 · 2 评论 -
科普文:算法和数据结构系列【数据结构:链表扩展之有序链表(Sorted Linked List)和LRU缓存链表(LRU Cache Linked List)原理、应用即java实现】
双向链表 (Doubly Linked List)、有序链表 (Sorted Linked List)、LRU链表 (Least Recently Used Linked List);LRU链表通常基于双向链表实现,结合哈希表来快速查找缓存中的数据。当缓存达到其容量上限时,最近最少使用的数据会被优先淘汰。LRU链表通常与哈希表结合使用。哈希表用于快速查找元素,而双向链表用于维护元素的使用顺序。每次访问元素时,都将其从链表中移除并重新插入到头部。当缓存达到容量限制时,尾部元素被移除。原创 2025-01-07 06:39:49 · 1120 阅读 · 0 评论 -
科普文:算法和数据结构系列【数据结构:链表扩展之跳表Skip List原理、应用即java实现跳表】
跳跃表(Skip List):在链表的基础上增加索引层次,通过多级链表结构加速查找过程。查找时间复杂度为O(log n),插入和删除操作的时间复杂度也为O(log n)。跳表可以看作是链表与二分查找的结合体,能够在保持数据有序的同时,实现快速的查找。跳表是一种随机化的数据结构,也可以被看做二叉树的一个变种,它在性能上和红黑树,AVL树不相上下,但是跳表的原理非常简单,目前在Redis和LeveIDB中都有用到。它采用随机技术决定链表中哪些节点应增加向前指针以及在该节点中应增加多少个指针。原创 2025-01-07 05:12:59 · 962 阅读 · 0 评论 -
科普文:算法和数据结构系列【数据结构:数组和链表】
数组和链表是两种基本且重要的数据结构,它们在存储方式、访问特性、操作复杂度以及应用场景等方面存在显著的差异。数组应用:图像处理中的像素数组、数据库中的记录数组。链表应用:实现LRU缓存淘汰算法、文件系统中的文件链表管理。原创 2025-01-07 02:48:40 · 1029 阅读 · 0 评论 -
科普文:算法和数据结构系列【算法和数据结构概叙】
算法和数据结构是计算机科学的核心概念,它们共同构成了高效程序设计的基础,因此在程序开发中起着至关重要的作用。“程序 = 数据结构 + 算法” 这一表述,虽然在某种程度上简化了程序的本质,但确实捕捉到了程序设计的两个核心要素。算法和数据结构是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。因此数据结构是基础,要学好算法、得先掌握数据结构。数据结构提供了存储和组织数据的方式,而算法则提供了操作这些数据的方法。原创 2025-01-07 01:05:58 · 1118 阅读 · 0 评论 -
科普文:算法和数据结构系列【机器学习、数据科学中的相似度与距离算法原理汇总--下篇】
常常需要估算不同样本之间的相似性度量(Similarity Measurement),估算相似性度的方法主要两种:距离(Distance)、相似度(Similarity)。相似度算法有:余弦相似度(Cosine Similarity)、杰卡德相似系数(Jaccard Similarity)、皮尔逊相关系数(Pearson Correlation Coefficient)、互信息/信息增益(Mutual Information/Information Gain)、相对熵/KL散度等等原创 2025-01-06 20:22:04 · 873 阅读 · 0 评论 -
科普文:算法和数据结构系列【机器学习、数据科学中的相似度与距离算法原理汇总--上篇】
在数据挖掘中、做分类时,常常需要估算不同样本之间的相似性度量(Similarity Measurement),估算相似性度的方法主要两种:距离(Distance)、相似度(Similarity)。应用场景有:数据分析、数据挖掘、搜索引擎等,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。常见的比如数据分析中比如相关分析,数据挖掘中的分类聚类(K-Means等)算法,搜索引擎进行物品推荐时。 相似度就是比较两个事物的相似性。一般通过计算事物的特征之间的距离,如果距离小,那么相似度大;原创 2025-01-06 17:32:05 · 1042 阅读 · 0 评论 -
科普文:Java基础之算法系列【哈希算法和位图:手搓LRU(Least Recently Used)过滤器】
LRU(Least Recently Used)过滤器是一种缓存替换算法,用于在缓存已满时决定哪些数据应该被替换。LRU算法基于这样一个假设:最近使用的数据在未来也更有可能被再次使用,而很久没有使用的数据在未来被使用的可能性较小。因此,当缓存容量达到限制时,LRU算法会优先淘汰最久未使用的数据,以便为新的数据腾出空间。原创 2025-01-05 22:34:21 · 857 阅读 · 0 评论 -
科普文:Java基础之算法系列【哈希算法和位图:手搓黑白名单过滤器】
黑白名单过滤器是一种基于访问控制的安全保护措施。它通过预定义的规则列表,对网络通信流量进行分类和过滤,从而实现对访问的控制和限制。黑名单用于列举不允许的网络通信对象或行为,而白名单则指定了允许的对象或行为。这种技术广泛应用于网络安全、垃圾邮件过滤、网站访问控制等领域。原创 2025-01-05 21:12:41 · 923 阅读 · 0 评论 -
科普文:Java基础之算法系列【哈希算法和位图:手搓布隆过滤器Bloom Filter】
布隆过滤器(Bloom Filter)是一种空间效率很高的概率型数据结构,它允许存在一定的误判率,但绝不会将一个存在的元素误判为不存在。布隆过滤器主要用于判断一个元素是否在一个集合中,广泛应用于去重、防止缓存击穿等场景。科普文:【哈希算法的扩展应用:HashRing哈希环、哈希切分、SimHash局部敏感哈希算法、GeoHash经纬度哈希、BloomFilter布隆过滤器、CuckooFilter布谷鸟过滤器等】_hash环增加节点时旧数据处理-优快云博客。原创 2025-01-05 14:30:42 · 853 阅读 · 0 评论 -
科普文:Java基础之算法系列【哈希算法性能和哈希冲突测试:CRC、BKDR、APHash、DJB、JSHash、RSHash、SDBM、PJWHash、ELFHash、Murmur、FNV等】
哈希算法的主要应用场景包括数据结构(如哈希表)、密码学(如消息摘要和数字签名)、数据完整性验证(如文件校验)等。选择合适的哈希算法时,需要考虑应用场景、性能需求、冲突处理等因素。而哈希算法的速度取决于具体的实现和应用场景, 但通常来说,简单的哈希函数(如BKDRHash, APHash, DJBHash等)会比复杂的加密哈希函数(如MD5, SHA系列)更快。接下来我们就看看这十几种哈希算法的耗时和哈希冲突的情况。原创 2025-01-05 12:29:30 · 990 阅读 · 0 评论 -
科普文:【哈希算法:CRC哈希系列、BKDR Hash、APHash、DJB Hash、JSHash、RSHash、SDBM Hash、PJWHash、ELFHash、MurmurHash、FNV等】
在编程中,字符串转hash是一个常见且重要的操作。为了简化这一过程,我们可以创建一个工具类HashUtils,其中包含了多种常用的字符串转hash算法,如CRC、MD5、SHA系列(SHA-1、SHA-256等)、BKDR hash、APHash、DJB Hash、JSHash、RSHash、SDBM Hash、PJWHash和ELFHash。这些字符串转哈希算法简介如下:BKDR Hash:以131为底的对数计算,适用于字符串哈希。APHash:通过加法、位操作和乘法计算哈希值,适用于字符串原创 2025-01-04 22:07:24 · 1271 阅读 · 0 评论 -
科普文:Java基础之算法系列【文本相似度判定算法:手搓余弦相似度(Cosine Similarity)+TF-IDF(词频-逆文档频率)】
前面我们梳理了文本相似度判断算法、以及simhash局部敏感哈希。今天我们再看看 余弦相似度和TF-IDF词频逆文频率来判断文本相似。:TF-IDF是一种常用的文本表示方法,用于衡量一个词在文档中的重要程度。结合向量空间模型,可以将文本表示为TF-IDF向量的集合,并通过计算向量之间的相似度来评估文本的相似程度。:余弦相似度是通过计算两个向量的夹角余弦值来评估它们的相似度。在文本相似度计算中,首先将文本转换为向量表示(如TF-IDF向量),然后计算这些向量之间的余弦值。余弦值越接近1,表示文本越相似。原创 2025-01-04 13:58:41 · 1169 阅读 · 0 评论 -
科普文:Java基础之算法系列【文本相似度判定算法:手搓Simhash局部敏感哈希算法】
SimHash基本原理是通过一系列的哈希函数将输入的文档转换为一个固定长度的指纹(通常是一个64位的整数)。然后,可以通过计算文档指纹的汉明距离来确定它们的相似度。汉明距离是指两个字符串对应位置的不同字符的个数。SimHash算法的主要工作是将文本进行降维,生成一个SimHash值,也就是“指纹”。原创 2025-01-01 21:54:00 · 1547 阅读 · 0 评论 -
科普文:Java基础之算法系列【文本相似度判定算法梳理】
在文本相似度中,可以将文本表示为词汇的集合,然后计算两个集合的Jaccard相似度。在文本相似度计算中,首先将文本转换为向量表示(如TF-IDF向量),然后计算这些向量之间的余弦值。因为根据现有资料,对于文本相似度判定算法的准确性排序,并没有一个绝对的标准,而且不同的算法在不同的应用场景和数据集上可能有不同的表现。结合向量空间模型,可以将文本表示为TF-IDF向量的集合,并通过计算向量之间的相似度来评估文本的相似程度。通过计算文本中词汇向量的余弦相似度,可以评估文本在语义上的相似性。原创 2025-01-01 20:55:15 · 903 阅读 · 0 评论