数据结构与算法基础
文章平均质量分 88
主要分享数据结构和算法基础内容,包括但不限制于链表、堆栈、数组、树、图、排序算法、查找算法、贪心算法、动态规划、双指针、快速幂等
华师数据学院·王嘉宁
研究方向:深度学习、自然语言处理、知识图谱。
研究兴趣:大语言模型训练与推理、知识增强预训练、Prompt-tuning、小样本学习、问答系统、信息抽取。
展开
-
HeapSort堆排序原理与实现
HeapSort堆排序原理与实现 堆排序是比较重要的数据结构,其主要优点是通过排序二叉树的特性能够记录每个数之间的大小关系,以至于不需要重复比较,对于海量数据排序问题可以减少时间复杂度。一、基本概念(1)大根堆(大顶堆):对于一个堆(完全二叉树),根结点的值是比所有结点的值都大,其子树中根结点的值也比子树中其他值都大。大根堆可以获得由小到大的递增序列;其定义为:A[i]≥A[2∗i]A[i]\ge A[2*i] A[i]≥A[2∗i]A[i]≥A[2∗i+1] A[i]\ge A[2*i+1]A原创 2020-06-03 09:48:45 · 772 阅读 · 0 评论 -
【算法编程】前缀和与差分算法
【算法编程】前缀和与差分题目描述输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。请你输出进行完所有操作后的序列。第一行包含两个整数n和m。第二行包含n个整数,表示整数序列。接下来m行,每行包含三个整数l,r,c,表示一个操作。样例6 31 2 2 1 2 11 3 13 5 11 6 13 4 5 3 4 2分析给定一个包含 nnn 个数组 AAA:知识点1:求差分与前缀和是一组相反的原创 2021-02-14 17:02:49 · 809 阅读 · 1 评论 -
【算法编程】朴素dijkstra算法——单源正权稠密图
朴素dijkstra算法——单源正权稠密图要求 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。 输入第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。 输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出-1。 结点个数范围 1≤n≤5001\leq n \leq 5001≤n≤500,边个数范围 1≤m≤1051\leq m \leq 10^51≤m≤105示例:非常好理解的网络配图原创 2021-03-02 12:36:16 · 344 阅读 · 0 评论 -
【推荐系统】协同过滤算法
协同过滤算法推荐系统构建三大方法:基于内容的推荐content-based,协同过滤collaborative filtering,隐语义模型(LFM, latent factor model)推荐。这篇博客主要讲协同过滤。——《推荐系统:协同过滤collaborative filtering》协同过滤(CF, Collaborative Filtering)的主要思想是:利用已有的用户群过去的行为或者意见预测当前用户最可能喜欢哪些东西或者对哪些东西感兴趣。主要应用场景是在线零售系统,目的是进行原创 2021-02-24 14:50:43 · 828 阅读 · 0 评论 -
【算法编程】Trie树(字典树)
【算法编程】Trie树(字典树) Trie树是一种非常简单且有效的数据结构,其主要用于针对包含大量的字符串,但所有字符串包含字符类型数量较少的情况下,对字符串的存储。最典型的应用就是存储单词,因此也称作字典树。 例如,给定几个单词,则可以用Trie树进行保存:给定单词 apple, able, app, aboard, far, are,可知这些单词有许多相同的前缀,因此可以通过多叉树的形式将公共的前缀进行合并,如下图所示,红色则为一个标记,用于标记从根结点到该结点是一个单词。由上图可知,原创 2021-02-22 15:34:56 · 370 阅读 · 0 评论 -
【算法编程】树的重心——DFS
【算法编程】树的重心——DFS题目:给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n-1行,每行包含两个整数a和b,表示点a和点b之间存在一条边。输出格式输出一个整数m,表示将重心删除后,剩余各个连通块中点数的最大值。数据范围1≤n≤105原创 2021-03-01 12:50:19 · 687 阅读 · 0 评论 -
【算法编程】用栈实现另一个栈的排序
【算法编程】用栈实现另一个栈的排序 给定一个栈,对其进行排序,使得栈顶至栈底的为降序,只能申请一个栈和变量,不能使用数组或多余的栈等数据结构. 试题来源:Coding Interviewing Guided (Page 12) 难度:★★★☆☆思路一C++源码://用一个栈实现另一个栈的排序//给定一个栈,对这个栈进行排序,使得栈顶至栈底的元素为降序排列,注意,只允许创建另一个栈,或相关的变量,不能使用数组等数据结构#include <iostream>#include原创 2020-12-29 21:42:29 · 380 阅读 · 0 评论 -
【算法编程】整数二分法
【算法编程】整数二分法问题描述: 整数二分法是常用的二分搜索算法,其主要应用场景是:给定一个有序且存在重复元素的序列,要求找出某个元素的起始位置和终点位置 例如给定一个序列 1,2,4,4,4,4,7,7,9,则元素4的起始位置是2,终点位置是5;元素7的起始位置是6,终点位置是7。分析: 给定包含 nnn 序列 a 需要实现两个二分函数,分别寻找待查询的元素 mmm 的最起始位置和最末尾的位置:起始位置(左侧):取区间 [l,r][l, r][l,r] 的中心位置,记做 mi原创 2021-02-14 16:38:49 · 572 阅读 · 0 评论 -
【算法编程】和为 K 的最少斐波那契数字数目
【算法编程】和为 K 的最少斐波那契数字数目 给定k个数,其满足斐波那契性质,从中挑选一部分数字(每个数只能被挑选1次)使得它们的和恰巧为k。目标是求出最少能够挑选几个数满足这个条件。k取值范围为 1≤k≤1091\leq k\leq10^91≤k≤109 。 试题来源: LeetCode.1414 难度:★★★☆☆【输入】k=7【输出】2【解析】斐波那契数字为:1,1,2,3,5,8,13,……,对于 k = 7 ,我们可以得到 2 + 5 = 7 。C++源代码: class原创 2020-09-14 20:32:01 · 565 阅读 · 0 评论 -
【算法编程】你所必须掌握的排序算法
【算法编程】你所必须掌握的排序算法 排序算法是计算机学科非常重要且常用的算法,也是计算机科班必须要掌握的内容。结合网上大量的教程、视频,以及个人的练习,对排序算法进行了简单的总结和分析。本文的主要参考教程包括十大经典排序算法(动图演示),大雪菜——浅谈各种排序算法。前记:(1)排序算法的分类包括:比较类排序:即通过两两比较来决定元素的前后顺序。通常我们常见的排序都是比较类排序。包括:交换排序(冒泡排序、快速排序):通过对比两个元素的大小并进行交换来;插入排序(简单插入排序、希尔排序):通原创 2021-02-12 17:41:34 · 507 阅读 · 0 评论 -
【算法编程】并查集
【算法编程】并查集并查集是一个非常简单高效的数据结构,其可以快速地对集合进行合并和查询,通常可用于集合的合并、图连通域的合并等。一个对并查集非常形象的解释可参见算法学习笔记(1) : 并查集基本原理:给定一组集合,每个集合可以用一棵树表示,树根的编号可以表示为整个集合的编号,每个结点保存其父结点的编号。可以维护一个数组 F[idx]F[idx]F[idx],其表示编号为第 idxidxidx 个结点的父节结点。初始化时,每个结点 idxidxidx 自身可以独立为一个集合,即定义为 F[idx]=原创 2021-02-22 16:06:33 · 238 阅读 · 0 评论 -
【算法编程】递归实现栈的逆序
【算法编程】递归实现栈的逆序 给定一个栈,在不使用额外数据结构和逆序类库的条件下实现栈内元素的逆序。例如入栈的顺序为12345,逆序后对应的出栈的顺序也是12345. 注意:不能使用额外的数据结构,因此传统的借助一个新的栈这种方法则不可以! 试题来源:Coding Interviewing Guided (Page 7) 难度:★★★☆☆C++源码://题目:给定一个栈,使用递归方法将其逆序;#include<iostream>#include<stack>原创 2020-12-27 16:21:58 · 820 阅读 · 0 评论 -
【算法编程】用最精炼的文字讲清楚KMP算法
KMP算法 前记:KMP算法是比较难理解的一个算法,通常许多文章可能需要阅读若干次才能看懂。本文试图用最精炼的文字讲清楚KMP算法。KMP算法是由D.E.Knuth、J,H,Morris 和 V.R.Pratt三人共同提出的模式匹配算法,其目标是改进传统的朴素算法(BF算法),并提高模式匹配的效率,使得模式匹配的时间复杂度由 O(n2)O(n^2)O(n2) 降低至 O(n)O(n)O(n)。 给定两个字符串,分别记做目标串 SSS 和 模式串 PPP,其长度分别为 n,mn, mn,m。 任务目标原创 2021-02-19 18:18:06 · 210 阅读 · 0 评论