
算法
文章平均质量分 85
zjruiiiiii
这个作者很懒,什么都没留下…
展开
-
与哈希函数有关的结构
经典的哈希表实现都是数组加链表,也有优化的实现,数组加红黑树。具体的可以了解哈希表的源码。数组是哈希表一个初始的桶区域,数组长度就是桶的个数,假设17,存记录的时候,先根据哈希函数算出一个哈希值(hashcode),然后再模17,得到的结果肯定是在 0 ~ 16 之间,然后挂在相应的区域下面;如果多个记录模完后值一样,那就顺着链表往下挂记录。删除,修改和查询操作也一样,根据哈希函数,相同的输入会导致相同的输出,将得到的哈希值模完17后,找到数组对应的位置,然后顺着链表往下操作。原创 2022-09-04 18:26:06 · 473 阅读 · 10 评论 -
资源限制类题目技巧大全
即使有些碰撞,一个文件中的数据多于1千万条,但没有关系。因为在前面我们算过,一个文件真正可以存的数据条数是1亿两千500条。1千万条只是比较保守的一个数,因此一个文件超了1千万条数据也不会有什么,也不会超的了多少。按照哈希函数的性质,一个相同的东西经哈希函数算出的哈希值一定相同。因此就一个东西就不可能会分配到多个文件当中。那么就可以用一个哈希表依次记录各个文件中出现次数最多的数,记录完一个文件的就释放哈希表的内存空间,再记录下一个文件中出现次数最多的数。原创 2022-08-22 11:37:18 · 904 阅读 · 18 评论 -
理解和熟悉递归中的尝试
递归的代码不要尝试去展开,它是需要一些自然智慧去理解的,并且是一个逐步尝试和改进的过程。原创 2022-07-29 22:37:17 · 577 阅读 · 22 评论 -
利用对数器验证算法代码程序
通常我们在笔试的时候或者参加编程大赛的时候,自己实现了一个算法,但是不能够判断该算法是否完全没问题,如果在比赛平台上验证,通常只会告诉你有没有错误,出了错不会告诉你哪里有问题,对于排错来说是非常坑爹的,所以对数器就横空出世了,对数器就是用一个绝对OK的方法和随机器生成的样本数据进行合体,如果你的算法是没问题的,那么和对数器的这个百分之百正确的方法一个元素一个元素的比较,也一定是equals的。如果返回false,说明你的算法有问题。简单来说,就是自己编写一个时间复杂度较低的算法和一个时间复杂度较高的算法进行原创 2022-07-04 18:26:57 · 601 阅读 · 37 评论 -
Map和Set及其背后二叉搜索树的数据结构
文章目录一、二叉搜索树1.二叉搜索树的概念2.二叉搜索树的查找一、二叉搜索树1.二叉搜索树的概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树2.二叉搜索树的查找因为二叉搜索树中 public Node search(int key) { Node cur = root; wh原创 2022-01-24 14:19:50 · 853 阅读 · 16 评论 -
基于比较的常见的排序
文章目录一、基数排序二、直接插入排序1.直接插入排序思路与代码2.直接插入排序特点、时间复杂度、空间复杂度、稳定性分析3.折半插入排序(了解)三、希尔排序1.希尔排序思路与代码2.希尔排序特点、时间复杂度、空间复杂度、稳定性分析四、选择排序1.选择排序思路与代码2.选择排序特点、时间复杂度、空间复杂度、稳定性分析五、冒泡排序1.冒泡排序思路与代码2.冒泡排序特点、时间复杂度、空间复杂度、稳定性分析六、堆排序1.堆排序的思路与代码2.堆排序特点、时间复杂度、空间复杂度、稳定性分析七、快速排序1.快速排序的思路原创 2022-01-18 11:07:31 · 2381 阅读 · 28 评论 -
优先级队列(堆)及其背后的数据结构
文章目录一、堆1.堆的概念二、堆的基本操作1.创建堆与向下调整2.创建堆的时间复杂度3.向上调整4.模拟优先级队列的offer操作5.模拟优先级队列的poll操作三、优先级队列集合的使用1.优先级队列中的比较规则2.特殊的比较方式3.刨析PriorityQueue中的offer源码四、有关堆的面试题1.堆排序(从小到大排)2.topK问题3.查找和最小的K对数字认识堆前的基本概念:1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。2、满原创 2022-01-16 20:29:50 · 911 阅读 · 9 评论 -
树与二叉树数据结构详解
文章目录一、树的基本概念1.树的知识框架1.树的定义3.树的基本术语4.树的性质一、树的基本概念1.树的知识框架1.树的定义树是n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:有且仅有一个特定的称为根的结点。当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。显然,树的定义是递归的,即在树的定义中又用到了自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一原创 2022-01-11 11:10:56 · 1260 阅读 · 28 评论 -
LeetCode——3.无重复的最长子串
对应LeetCode题题目:在主串中要求不重复的子串的长度,首先想到的就是滑动窗口。但是想如何滑动是非常关键的。我考虑用空间来换取时间。定义不重复子串的开始位置为 start,结束位置为 end随着 end 不断遍历向后,会遇到与 [start, end] 区间内字符相同的情况,此时将字符作为 key 值,获取其 value 值,并更新 start,此时 [start, end] 区间内不存在重复字符无论是否更新 start,都会更新其 map 数据结构和结果 ans。时间复杂度:O(n)原创 2021-11-29 16:33:07 · 814 阅读 · 39 评论 -
链表经典面试题(含图解)
文章目录一、删除链表中等于给定值 **val** 的所有节点二、反转单链表三、找链表的中间结点四、找链表中的第k个结点五、合并两个有序链表六、分隔链表七、删除排序链表中的重复元素八、判断一个链表是否是回文链表九、两个链表的第一个公共节点十、判断一个链表是否有环十一、判断一个链表是否有环,并返回第一个结点一、删除链表中等于给定值 val 的所有节点对应leetcode题因为要删除某一个结点,就要遍历到该结点之前的位置。为了记录需要删除的结点的前一位置,我们需要另外创建一个指针pre来记录。先不对头结点原创 2021-11-08 19:23:54 · 2706 阅读 · 14 评论 -
数据结构KMP算法配图详解(C语言、Java实现,超详细)
文章目录一、什么是KMP算法?二、KMP算法的解决题型三、模式串移动距离的判断(next数组)四、KMP算法的具体实现五、KMP算法的时间复杂度六、next数组的改进--nextval数组及具体代码七、最后的话一、什么是KMP算法?KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法是在 BF 算法基础上改进得到的算法。学习 BF 算法我们知道,该算法的实现过程就是 “傻瓜式”原创 2021-10-18 15:25:45 · 5587 阅读 · 18 评论 -
求0-10000之间的水仙花数,并将这个数输出,打印。
水仙花数的定义“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身。如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。题目求出0~100000之间的所有“水仙花数”并输出。解题思路题目讲的是一个n位数,其各位数的n次方之和等于这个数,我们就得先知道这个数有多少位,能够获取到每个位的数,才能够进行计算,并且每个数的n次方我们也得单独进行计算,如此之后才能进行判断。第一个函数用来判断这个数有多少位。第二个函数来求一个数的n次方。第三个原创 2021-09-13 18:47:08 · 1896 阅读 · 13 评论 -
字符串旋转问题详解
题目名称:字符串左旋题目内容:实现一个函数,可以左旋字符串中的k个字符。例如:ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB方法一:暴力求解这种方法相对比较容易,我们先来看看代码:void left_move(char* arr, int k){ int i = 0; assert(arr); int len = strlen(arr); for (i = 0; i < k; i++) { //左旋转1个字符 //1. 保存第一个字符 cha原创 2021-09-10 12:42:32 · 533 阅读 · 14 评论 -
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个只出现一次的数字。
文章目录一、问题描述二、解决问题1.异或运算知识2.解决思路三、源代码一、问题描述 一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个只出现一次的数字,编程实现。 例如数组为{1,3,5,7,1,3,5,9},找出7和9 。二、解决问题1.异或运算知识  原创 2021-08-31 00:10:28 · 725 阅读 · 4 评论