- 博客(20)
- 收藏
- 关注
原创 数据结构——栈与队列的定义和特点
栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为限定性的数据结构。线性表插入删除位置任意而栈只能对表尾(栈顶)的元素进行插入和删除操作。栈和队列的区别:栈是吃进去的东西吐出来(嘴【栈顶】)队列是吃进去的东西拉出来(队首和队尾)由于队列的操作具有先进先出的特性,使得队列成为程序设计中解决类似排队问题的有用工具。1.定义:只能在表的一端进行插入运算在表的另一端进行删除操作运算的线性表(头删尾插)1.定义:限定只能在表的一端进行插入和删除操作运算的线性表(只能在栈顶操作)
2025-03-29 14:46:39
447
原创 C++ 数据结构 - 二叉树
例如前序遍历,首先写下根 ( 1 ),然后是左边,这时候,我们将左边以 2 为根的子树看做是一棵树,并在这棵树上继续进行遍历,继续按照根左右来写下 ( 2 ),然后继续向左走,将以 4 为根的子树看做一棵树,并写下根 ( 4 ),但是这里已经没有左右子树了,所以就向上回溯,来到以 2 为根的子树,刚才遍历到了左边,现在遍历右子树,即以 5 结点为根的子树继续遍历...我们知道,前序遍历遍历的第一个结点就是整棵树的根结点,即 1 号结点,所以我们可以先将结点 1 画下来。那如何根据树来写相对应的遍历方式呢。
2025-03-29 14:46:04
261
原创 C++ 数据结构 - 队列
优先队列是一种特别的队列,即有优先级的队列,相比于普通队列,优先队列可以将放入的数据进行排序,说白了就是放入一个数据,然后按照比较的方式依次向前交换,知道找到合适的位置,类似插入排序,所以,优先队列最主要的就是排序,也就是如何插入,只需在插入上做点功夫,其它地方都照旧即可。,如果我们将后面的 2,78,109 和 89 依次移动到前面去,时间复杂度将会是线性的,如果要多次删除,这样的时间复杂度显然无法接受,所以,就利用了 head 和 tail 来代替队首和队尾,通过移动来实现插入和删除操作。
2025-03-29 14:45:31
439
原创 数据结构 KMP算法 next、nextval值计算
求第七位字符的next值,取前一位(第六位字符)[6 a 4],对应第四位字符[4 b 2],字符不相同(a与b不相同) ,继续取第三位字符[4 b 2]对应的第二位字符[2 b 1]比较,字符不相同(a与b不相同),继续取第二位字符[2 b 1]对应的第一位字符[1 a 0]比较,字符相同(a与a相同),取第一位字符的上一位字符[2 b 1]的next+1 得第七位字符的next值 为1+1 =2。
2025-03-29 14:44:43
650
原创 数据结构之B树/B+树
二叉树我想大家都不陌生,其实,B树和后面讲到的B+树也是从最简单的二叉树变换而来的,并没有什么神秘的地方,下面我们来看看B树的定义。在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别。上面的这些介绍,相信对于B树已经有一定的了解了,接下来的一部分,我们接着讲解B+树,我相信加上B+树的对比,就更加清晰明了了。下面,我们通过一个插入的例子,讲解一下B树的插入过程,接着,再讲解一下删除关键字的过程。
2025-03-29 14:44:07
472
原创 数据结构——串
串相等:当且仅当两个串长度相等,并且各个对应位置上的字符都相同时,这两个串才是相等的 所有的空串都相等 串的应用非常广泛,计算机的大多数非数值处理的对象大多数是字符串数据,例如:文字编辑、符号处理,各种信息系统等等。的字符组成的子序列(含空串)称为该串的子串 主串:包含子串的串就相应的称为主串 字符位置:字符在序列中的序号为该字符在串中的位置 子串位置:子串第一个字符在主串中的位置。空格串:由一个或多个空格组成的串,与空串不同,空格串有内容有长度且只由空格组成 子串:串中任意个。
2025-03-28 23:52:55
127
原创 数据结构——哈夫曼树
2.循环1->n存叶子结点从n+1->2n-1(总个数) void CreatHuffmanTree(HuffmanTree HT, int n) { if(n<=1) return;//数组共2n-1个元素 HT=new HTNode【m+1】;//输入前n个元素的weight值 } //初始化结束,下面开始建立哈夫曼树 for(i=n+1;//在HT【k】{1<=k<=i-1}中选择两个其双亲域为0, //且权值最小的结点,并返回它们在HT中的序号s1和s2 HT【s1】.parent=i;
2025-03-28 23:52:23
1354
原创 基于协同过滤的推荐算法(用户协同、物品协同、模型协同)
进行的预处理后,根据不同应用的行为分析方法,可以选择分组或者加权处理,之后可以得到一个用户偏好的二维矩阵,一维是用户列表,另一维是物品列表,值是用户对物品的偏好,一般是 [0,1]或者[-1, 1]的浮点数值。缺点:1用户历史偏好是用稀疏矩阵进行存储的,而稀疏矩阵上的计算有些明显的问题,包括可能少部分人的错误偏好会对推荐的准确度有很大的影响等等。基于项目的协同过滤推荐的基本原理是,使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。
2025-03-28 23:51:13
2132
原创 常用推荐算法总结
效⽤知识( FunctionalKnowledge)是⼀种关于⼀个项⽬如何满⾜某⼀特定⽤户的知识,因此能解释需要和推荐的关系,所以⽤户资料可以是任何能⽀持推理的知识结构,它可以是⽤户已经规范化的查询,也。基于效⽤:基于效⽤的推荐(Utility-based Recommendation)是建⽴在对⽤户使⽤项⽬的效⽤情况上计算的,其核⼼问题是怎样为每⼀个⽤户去创建⼀个效⽤函数,因此,⽤户资料模型很⼤程度上是由系统所采⽤的效⽤函数决定的。研究和应⽤最多的是内容推荐和协同过滤推荐的组合。3.基于图的推荐算法。
2025-03-28 23:50:28
220
原创 数据结构 —— 排序算法(总结)
以从小到大排序为例,比它小的都“扔”到它的左边,比它大的都“扔”到它的右边,然后左右两边再分别重复这个操作,不停地分,直至分到每一个分区的基准数的左边或者右边都只剩一个数为止。希尔排序的思想特别像在插入排序基础上得到了改进,希尔排序也成为“缩小增量排序”,其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。我们先根据序列的个位数的数字来进行分类,将其分到指定的桶中。
2025-03-28 23:49:24
800
原创 快速排序的思路与优化改进(C 语言描述)
为了达到更好的切分效果,也可以选择随机在数组中寻找三个元素,用它们的中位数元素作为枢轴(pivot)进行数组元素的切分。因为切分的标志元素总是在大循环结束之后进行的,也就是说在前面的交换里,没有将自身加进来,这样就达成了使用更少的交换次数得到同样效果的目的。基本快速排序的切分方法中,针对于切分的标志元素(这里是数组的首元素),通过自身与数组中其他元素不断交换位置来达到切分目的。非交换快速排序中并没有使用到前面的交换方法,它是通过事先保存切分标志元素的内容,重复进行前后赋值来实现的。
2025-03-28 23:48:38
281
原创 C语言 数据结构 线性表的顺序存储及其操作实验
例如:{6,4,10,7,9,2,20,1,3,30},k1=5,k2=8时候,一种结果为([3,4,1,2],,6,7,[20,10,9,30])。例如A={1,3,4,5,6,7},B={3,5,6,8,9,11},输出A-B的结果={1,4,7}(3)在list[]={3,3,4,9,5}中删除指定位置(i=3)上的元素4,实现顺序表的删除的基本操作。(2)在list[]={3,2,4,5}的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。q++){ //将值赋给新创建的顺序表。
2025-03-28 23:47:48
845
原创 二叉堆实现
/ 当前(current)节点的大小 while(l <= end) { // "l"是左孩子,"l+1"是右孩子 if(l < end && mHeap[l] < mHeap[l+1]) l++;}/* 将data插入到二叉堆中* 返回值: 0,表示成功* -1,表示失败*/template <class T>int MaxHeap<T>::insert(T data){ // 如果"堆"已满,则返回 if(mSize == mCapacity) return -1;
2025-03-28 23:47:14
573
原创 数据结构与算法之哈希表
当插入时,哈希函数计算到相应的桶,然后头节点或者尾节点插入即可,在java的HashMap(与HashTable有区别,但是大致近似)中,Java7叫Entry而Java8中叫Node,而在java8以前使用的是头插法,java8之后改为了尾部插入,此处与扩容机制有关,以后再介绍,今天先介绍哈希表的原理。这同样减小了冲突的可能。上面说到哈希冲突是不可避免的,并且当桶都用完了(即使是链表寻址,链表长度十分大的时候,增删改查操作也不是那么容易进行的),新的数据就不能加进来了,这时就需要用到了扩容机制。
2025-03-28 23:46:11
609
原创 算法【数据结构】时间复杂度的计算
上面算法循环体中的代码执行了n次,因此时间复杂度为O(n),实际上,在for循环里面的所有时间复杂度为O(1)的语句总的时间复杂度都是O(n)。大O表示法O(f(n)中的f(n)的值可以为1、n、logn、n²等,因此我们可以将O(1)、O(n)、O(logn)、O(n²)分别可以称为常数阶、线性阶、对数阶和平方阶。上面算法的运行的次数的函数为f(n)=3,根据推导大O阶的规则1,每次运行程序每条语句执行一次,所以这个算法的时间复杂度仍旧是O(1),我们可以称之为常数阶。没有输出的算法是毫无意义的;
2025-03-28 23:45:35
717
原创 数据结构与算法基础
/单链表的定义 *是指针变量 *LinkList指向Node的指针。//从头节点开始,将头节点赋值给p。// 将L的下一节点赋值给L。//指针q指向p的下一节点。//清空单链表 思想:先保存下一节点,在删除当前节点。//指针p指向首元节点。//要删除节点的上一个节点。* p = p->next p指向下一节点。//保存要删除的节点。//初始化单链表 创建头节点。//在链表第i个位置插入元素。//获取链表第i个元素值。//删除链表的第i个节点。//定义一个学生节点。
2025-03-28 23:45:04
297
原创 数据结构——算法和算法分析
所谓的算法分析并非精确统计算法实际执行所需时间,而是针对算法中语句的执行次数做出估计,从中得到算法执行时间的信息。是算法的测试数据设计困难,并且程序的运行时间往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。类C语言介于伪码语言和程序设计语言之间的一种表示形式,保留了C语言的精华,不拘泥于C语言的语法细节,同时也添加了一些C++的成分。一个算法的执行时间大致上等于其所有语句执行时间的总和,而语句的执行时间则为该条语句的重复执行次数和执行一次所需时间的乘积。伪代码(类C语言);
2025-03-28 23:44:12
1444
原创 算法与数据结构-理解递归+哈希表&有序表
在这段代码中,虽然 z1 和 z2 的内容相同(值都为1),但是它们是两个不同的对象,因此它们的 hashcode 也是不同的。“==”是使用引用传递的, 所以 a==b 因为内存不同是false, 因为a和b是整数, 属于基本数据类型,而对于基本数据类型,哈希表是值传递的, 所以用b的值是查找a对应的结果是true。对于基本数据类型,传递的是值本身的拷贝,即方法内部对参数进行修改不会影响原值。对于对象类型,传递的是对象的引用的拷贝,HashMap 不会对对象的内容进行复制,只是存储了对象的引用。
2025-03-28 22:42:57
325
原创 推荐算法介绍
Word2Vec 是一种将词语嵌入到向量空间中的方法,用于捕捉词语之间的语义关系,常用于推荐系统中的文本处理。LSA 是一种文本分析技术,用于将文档和词语表示为低维空间中的向量,常用于推荐系统中的文档推荐。使用电影评分数据集,最后生成两个数据分析图形:一个是原始评分矩阵的热图,另一个是重构后的评分矩阵的热图。:通过精准的广告投放,利用用户的搜索记录和行为数据,展示相关的广告内容,提高广告的点击率和转化率。:基于用户的兴趣和行为数据,推荐系统推送个性化的内容或产品,增强用户体验并提升平台的用户粘性。
2025-03-28 22:40:57
327
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人