
数据结构
文章平均质量分 50
乐行僧丶
这个作者很懒,什么都没留下…
展开
-
B-树,B+树,B*树
文件索引系统中应用why?数据量非常大-》在磁盘中存储-》会给数据创建索引-》给数据进行排序,加速搜索需要解决两个问题?1.减少磁盘的IO2.更快的搜索算法操作系统中,管理内存是按照页page 4K 管理的管理磁盘是按照block 16K现在有n = 1000w个索引需要从磁盘中进行读取和搜索?avl树和m为300的B-树?avl树的高度:log2n = 24层最差的情况一个节点只存储一个索引?最差需要24次磁盘IOB-树高度:log(300)n = 3 层最多花费3次磁盘IO原创 2021-11-26 23:05:03 · 298 阅读 · 0 评论 -
单链表逆置(递归和迭代)
迭代class Solution { public ListNode reverseList(ListNode head) { if (head == null) return head; ListNode a=head, b=head.next; head.next = null; while (b != null) { ListNode c = b.next; b.next = a; a = b; b = c;原创 2020-11-16 01:31:40 · 392 阅读 · 0 评论 -
BF算法-串匹配算法
串的模式匹配:暴力算法,时间复杂度为O(n)。#include <bits/stdc++.h>using namespace std;// 返回第一次匹配到的位置int bf(char *s, char *t) { int i=0,j=0,k=0; while (i < strlen(s) && j < strlen(t)) { if (s[i] == t[j]) { i ++, j++; } else { j = 0; // 模式串原创 2020-11-11 10:51:08 · 206 阅读 · 0 评论 -
层序遍历求树的深度
#include <bits/stdc++.h>using namespace std;struct TreeNode { int val; TreeNode *left, *right;};void dfsGetDepth(TreeNode *root, int &x) { if (!root) return; queue<TreeNode*> q; q.push(root); while (!q.empty()) { int原创 2020-11-09 21:20:30 · 675 阅读 · 1 评论 -
最长回文子串
class Solution {public: string longestPalindrome(string s) { if (s.size()==1 || !s.size()) return s; if (s.size()==2 && s[0]==s[1]) return s; int n = s.siz(); vector<vector<bool>> f(n, vector<bool>(n)); // 记录子串的起始索引和长度原创 2020-10-29 07:48:54 · 146 阅读 · 0 评论 -
多机调度问题(贪心)
有n个任务,m台机器,n>m,每个作业i可以选择一台设备进行加工,加工时间为ti,每台机器同时只能加工一个作业,且不可中断。实现作业调度,使得n个作业的等待时间最短。样例输入:6 32 5 13 15 16 20样例输出:28贪心策略:优先处理花费时间长的任务,这样可以减少短任务的等待时间实现:#include <bits/stdc++.h>using namespace std;const int N=10010;int t[N]; // 存储任务所需要时间原创 2020-10-28 12:23:56 · 1346 阅读 · 0 评论 -
输出二叉树中值为x的祖先
struct node { int val; node *left, *right;};// 返回值判断二叉树中是否含有x// 含有x并且在子树中 则当前节点是一个祖先// 含有x但是就是当前节点的值 则直接返回到上一层调用bool ancestor(node *root, int x) { if (!root) return false; if (root->val == x) return true; if ((root->left && root-&g原创 2020-10-24 22:59:35 · 542 阅读 · 0 评论 -
最近公共祖先lca(C++实现)
#include <bits/stdc++.h>using namespace std;struct node { int val; node *left, *right;};node *lca(node *root, node *p, node *q) { if (!root || root==q || root==q) return root; auto left = lca(root->left, p, q); auto right = lca(root-&g原创 2020-10-24 18:38:47 · 622 阅读 · 0 评论 -
1024我在csdn
程序员的快乐原创 2020-10-24 09:56:44 · 189 阅读 · 0 评论 -
二叉树的宽度
算法思想:用一个w维护当前二叉树的宽度,使用层序遍历的方式,每次入队后更新w的值。#include <bit/stdc++.h>using namespace std;struct TreeNode { int val; TreeNode *left, *right;};int width(TreeNode *root) { if (!root) return 0; queue<TreeNode*> q; q.push(root); int w = 1;//原创 2020-10-14 02:10:59 · 366 阅读 · 0 评论 -
平衡二叉树(AVL)C++实现
#include <bits/stdc++.h>using namespace std;class AVL {private: struct node { int val; int height; node *left, *right; node (int x) { this->val = x; this->height = 1; this->left = this->right =原创 2020-10-09 21:40:34 · 207 阅读 · 0 评论 -
一维数组&二维数组&对称矩阵&三角矩阵&三对角矩阵地址的计算
一维数组的地址计算设每个元素的大小是size,首元素的地址是a[1],则a[i] = a[1] + (i-1)*size若首元素的地址是a[0]则a[i] = a[0] + i*size二维数组的地址计算 (m*n的矩阵)行优先设每个元素的大小是size,首元素的地址是a[1][1],则a[i][j]?分析:a[i][j]位于第i行,第j列。它之前有i-1行,在第i行它之前有j-1个元素。即a[i][j] = a[1][1] + [n*(i-1) + (j-1)]*size三维数组的地原创 2020-10-07 20:39:23 · 8943 阅读 · 3 评论 -
并查集(路径压缩)C++实现
class UnionFind {private: int *father; int count;public: UnionFind(int n) { this->count = n; father = new int[n]; for (int i=0; i<n; ++i) father[i] = i; } ~UnionFind(int n) { delete[] father; } // 查找索引为x的节点的父亲节点的索引 int find(int x) {原创 2020-10-07 22:16:43 · 309 阅读 · 0 评论 -
插入型排序
插入型排序包括:直接插入排序 折半插入排序 希尔排序直接插入排序时间复杂度:O(n^2)空间复杂度:O(1)稳定性:稳定比较次数和移动次数与待排序序列的初始状态有关最好情况:序列有序 比较次数:n-1次 移动次数:0最差情况:序列逆序 比较次数:1+2+3+…+n-1次 移动次数直接插入特性:当数组基本有序时,时间复杂度达到O(n)void insertSort(int *a, int n) { for (int i=1; i<n; ++i) { int x = a[i原创 2020-09-17 01:33:03 · 340 阅读 · 0 评论 -
极大连通子图、极小连通子图、极大强连通子图和极小强连通子图
一、极大连通子图(1)极大连通子图是连通图的一个连通分量,连通分量本身是一个连通图。(2)连通图的极大连通子图只有一个就是其本身,是唯一的。(3)非连通的极大连通子图有多个,每一个都是一个连通图。为什么称为极大?如果将连通分量外的任意一个顶点添加进连通分量都会造成不连通。二、极小连通子图(1)一个连通图的生成树是该连通图的极小连通子图。同一个连通图可以有不同的生成树,所以生成树不是唯一的。(2)极小连通子图=生成树,则有n个顶点,必然有n-1条边。(3)为什么称为最小?如果去极小连通子图的一原创 2020-08-26 09:55:30 · 16141 阅读 · 2 评论 -
具有n个节点的度为m的树的最大高度和最低高度推导
一、最大高度试想一下,若有n个节点的m叉树,当只有最后一层有m个节点,其余层均只有一个节点,在所有含有个节点的m叉树中一定是最高的。二、最低高度当每个非终端节点均含有m个孩子节点时间,此时整棵树在所有含有n个节点的m叉树中是最矮胖的,此时这棵树的高度也是含有n个节点m叉树中高度最低。在极限的状态下可以称之为满m叉树,因此可以推导不等式,得出最低高度。结论:综上分析,对于一个含有n个节点...原创 2019-11-29 12:23:03 · 9055 阅读 · 4 评论 -
四大查找ASL的总结
一、一般线性表的顺序查找ASL成功 = (n+1)/2ASL失败 = (n+1)二、有序线性表的顺序查找ASL成功 = (n+1)/2ASL失败 = (n+1)/2 + n/2三、二分查找二分查找的ASL成功和ASL失败通过画出对应查找序列的判定树,进而进行计算。四、索引查找ASL = I块内 + I块间其中块间可以使用二分查找。(1)ASL = (b+1)/2 + (s+1...原创 2019-11-26 20:54:44 · 7665 阅读 · 0 评论 -
数据结构中“哨兵”的使用
1.顺序查找中的哨兵:通过引入哨兵,可以必满很多不必要的语句,从而提高程序效率。2.直接插入排序的哨兵:免去查找过程中每一步都要检测整个查找表是否产找完毕,提高查找效率。...原创 2019-11-26 20:18:33 · 2253 阅读 · 0 评论 -
二叉树:在孩子兄弟链表表示的树中求叶子节点的个数
typedef struct CSNode { int val; CSNode *firstchild, *nextsibling;} CSNode, *CSTree;int dfs(CSTree *root) { if (!root) return 0; else if (!root->firstchild) return 1; else { int le...原创 2019-11-24 16:16:06 · 7290 阅读 · 11 评论 -
常见排序算法的时间复杂度和空间复杂度表
原创 2019-11-17 17:54:48 · 304 阅读 · 0 评论 -
严格m叉树(正则m叉树)
严格m叉树:只有度为0的节点和度为m的节点。如何构造正则m叉树:首先寻找N0节点的个数与Nm节点的个数之间的关系。(1)从节点个数看:N = N0 + Nm(2)从分支数看:N - 1 = mNm联立两个方程得:(m-1)*Nm = N0-1所以:Nm = (N0-1)/(m-1)开始时,有n个节点,即叶子节点有n个。计算Nm=(N0-1)%(m-1),如果Nm=0则说明刚刚好可以构造...原创 2019-11-13 09:50:31 · 5171 阅读 · 2 评论 -
链地址法处理hash冲突建立Hash表代码练习
给定一个数组x[] = {4, 1, 3, 7, 8, 22, 45, 75}, 哈希函数为H(key) = key*2 % 11,采用链地址法处理哈希冲突。建立哈希表:#include <bits/stdc++.h>using namespace std;const int maxsize = 11;//哈希函数int hash(int x) {return x*2 % ...原创 2019-11-11 09:50:13 · 584 阅读 · 0 评论 -
B-树查找算法的简单实现
B-树节点类定义struct node { int n; //关键字个数 int key[maxsize]; //关键字数组 node *ptr[maxsize+1]; //指向孩子节点的指针的数组};//在以root为根节点的B树中查找值为x的节点node *dfs(node *root, int x) { if (!root) return NULL; else { i...原创 2019-11-09 23:36:07 · 500 阅读 · 0 评论 -
八皇后--回溯法
#include <bits/stdc++.h>using namespace std;const int N=8;int chess[N][N];int cnt = 0;void init() { for (int i=0; i<N; ++i) { for (int j=0; j<N; ++j) chess[i][j] = 0; }}v...原创 2019-11-09 15:47:34 · 161 阅读 · 0 评论 -
前缀表达式(波兰表达式)的计算
波兰表达式也称之为前缀表达式,即运算符放置于操作数之前。计算波兰表达式的值的方法:(1)从后往前遍历表达式。(2)遇到数字直接入栈。(3)遇到运算符,取出两个数字,第一个作为操作数,第二作为被操作数,执行相应的运算。将运算的结果继续入栈。(4)当表达式遍历完时,此时栈顶元素即为计算结果。int cal(string s) { stack<int> st; for (i...原创 2019-11-09 09:55:27 · 1570 阅读 · 0 评论 -
单链表:删除带头结点递增有序单链表中开区间(a,b)的所有节点
struct node { int val; node *next;};void deleteBetweenMaxAndMin(node *head, int minv, int maxv) { node *p = head; node *q = head->next; node *premin = head, *premax = head; node *pmin ...原创 2019-11-09 09:06:32 · 1172 阅读 · 0 评论 -
二叉树:关于二叉树节点个数以及高度计算的相关问题以及其衍生问题
1.N个节点的二叉树的最低高度和最高高度?2.N个节点完全二叉树的最低高度或者最高高度?3.N个节点的m叉树的最小高度和最大高度?4.高度为h的完全二叉树最小有多少个节点,最多有多少个节点?5.给定完全二叉的节点个数,求完全二叉树叶子节点的个数?6.给定完全二叉树叶子节点的个数,求最多的节点个数?7.给定完全二叉树在某层有n个叶子节点,则完全二叉树的最多和最少节点个数?8.给定完全二...原创 2019-11-08 23:44:02 · 2719 阅读 · 0 评论 -
单链表:删除带头节点单链表中最小值所有在的节点
思路:用两对前驱和后继节点,分别比较当前节点的前驱和后继以及最小值界定啊的前驱和后继。遍历完整个链表,删除最小值节点即可。struct node { int val; node *next;};void deleteMin(node *head) { node *p = head, *q = head->next; node *premin = head, *pmin =...原创 2019-11-08 19:58:39 · 1112 阅读 · 0 评论 -
二叉树:统计二叉树同时拥有左右孩子节点的个数
二叉树遍历的应用struct node { int val; node *left, *right;};int dfs(node *root) { if (!root) return 0; if (root->left && root->right) return1; return dfs(root->left) + dfs(root->r...原创 2019-11-08 11:00:06 · 2869 阅读 · 0 评论 -
数据结构:三元组的定义(考研)
//非零元素的节点类的定义struct triple { int e; int col, row;};#define maxsize 100struct tripleMatrix { triple data[maxsize]; int m;//m行 int n;//n列 int size;//三元组中非零元素的总个数};注意:三元组在存储稀疏矩阵时,只有当稀疏矩阵的稀...原创 2019-11-08 10:17:38 · 6271 阅读 · 3 评论 -
二叉树:二叉树的最大路径和
二叉树的最大路径和,枚举二叉树的每一个节点,通过当前节点最大路径和是, 当前节点左子树的最大路径和+root->val+当前节点右子树的最大路径。struct node { int val; node *left, *right;};int ans = MIN_MAX;//用于维护最大路径和int dfs(node *root) { if (!root) return 0;...原创 2019-11-07 20:23:59 · 261 阅读 · 0 评论 -
二叉树:二叉树的直径
二叉树直径的定义:二叉树中路径的最大长度二叉树中路径的最大长度,可以理解所有节点的左右子树高度之和的最大值。假设二叉树有n个节点,编号为{a1,a2,…,an}, 其对应的左右子树的高度之和为H = {h1,h2,h3,…,hn}, 则该二叉树的直径为max(H)。struct node { int val; node *left, *right;};int ans = 0;// ...原创 2019-11-07 20:08:44 · 1715 阅读 · 0 评论 -
算法:判断字符串是否为回文串的三种方法(递归,循环,使用栈模拟递归)(考研)
一、递归bool ispalindrome(string s, int i, int j) { if (i >= j) return true; if (s[i] == s[j]) return ispalindrome(s, i+1, j-1); else return false;}二、使用栈模拟递归bool ispalindrome(string s) { int n...原创 2019-11-07 14:01:29 · 2608 阅读 · 0 评论 -
二叉树:前序、中序和后序遍历的方便记忆和应试非递归写法(考研)
前序遍历:struct node { int val; node *left,*right; };vector<int> preorder(node *root) { vector<int> res; if (!root) return res; stack<node*> st; auto p = root; while (p || st.s...原创 2019-11-07 08:48:07 · 238 阅读 · 0 评论 -
合并两个有序数组,要求时间复杂度为O(n),空间复杂度为O(1)
思路:因为数组已经是有序的,因此我们可以直接从两个数组的末位开始比较,将大的一个直接放到第一个数组的末尾,此时必须要求a数组的空间大小能够同时填充a数组和b数组的有效元素,然后依次比较两个数组元素的大小即可。代码实现:#include <bits/stdc++.h>void merge(int *a, int n, int *b, int m) { int i = n-1;/...原创 2019-11-03 20:50:23 · 2899 阅读 · 1 评论 -
二叉树:将二叉树中的所有节点的左右子树进行交换
二叉树遍历的简单应用struct node { int val; node *left, *right;};node *swapSubTree(node *root) { if (!root) return NULL; else { //交换的过程 node *tmp = root->left; root->left = root->right; ...原创 2019-11-03 19:37:05 · 4723 阅读 · 0 评论 -
单链表:在带头节点单链表中删除(minv, maxv)中的所有节点
链表节点删除,只有标记待删除节点的前驱节点即可;[注]:如果不是带有节点设置一个虚拟节点即可,返回时返回dummy->next。struct node { int val; node *next;};void delInterval(node *head, int minx, int maxx) { if (!head) return head; node *pre = h...原创 2019-11-03 19:20:44 · 618 阅读 · 0 评论 -
二叉树:计算叶子节点个数
叶子节点的特征:左右孩子均为NULLstruct node { int val; node *left, *right;};int countLeaf(node *root) { if (!root) return 0; else { if (!root->left && !root->right) return 1; return count...原创 2019-11-03 19:04:05 · 1572 阅读 · 0 评论 -
二叉树:前序与后序、前序与中序以及中序与后序相同、相反的特征
一、前序序列与后序序列1.前序序列和后序序列相同空树或者只有根节点的二叉树2.前序序列和后序序列相反(1)当且仅当二叉树中只有一个叶子节点(2)二叉树的高度和其节点个数相同二、前序序列与中序序列1.前序序列和中序序列相同任意节点没有左孩子节点2.前序序列和中序序列相反(1)任意节点没有右孩子节点(2)三、中序序列与后序序列1.中序序列和后序序列相同任意节点没有右孩子节点...原创 2019-11-02 07:35:47 · 32849 阅读 · 4 评论 -
判断两棵二叉树是否相同
struct node { int val; node *left, *right;};bool isSame(node *a, node *b) { if (!a && !b) return true; if ((!a && b) || (!b && a)) return false; if (a->val == b-&...原创 2019-11-01 10:04:52 · 931 阅读 · 0 评论