自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 二叉树的广度优先遍历和题目

二叉树广度优先遍历利用队列 。typedef char BTDataType;typedef struct BinaryTreeNode{ BTDataType data; struct BinaryTreeNode* left; struct BinaryTreeNode* right;}BTNode;typedef BTNode* QDataType; // 链式结构:表示队列 typedef struct QueueNode { struct QueueNode* ne

2024-09-18 18:26:13 297

原创 二叉树的链式结构和递归程序的递归流程图

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。链式结构又分为二叉链和三叉链,当前学习二叉链。如果是为了存储数据,线性表更简单,二叉树更复杂,并且插入删除也不好定义。有意义的是通过二叉树引出搜索树,搜索树又有AVL树和红黑树。前中后序的本质是一样的,就是打印的时机不同。深度就是 左边的深度 和 右边的深度 更深的那一个在加1 就是这层现在的深度。

2024-09-18 15:17:10 340

原创 堆排序的实现和TopK问题

2.把剩下的N-K个数据,和堆顶数据进行比较,如果比堆顶的数据小,则替换堆顶的数据,调堆。空间复杂度:O(K)。如果数组的N很大,100亿个数(40个G空间),求K=10前十个最什么的数。堆排序:排升序建大堆,第一步需要先建堆 时间复杂度是O(N)。直接选择排序的时间复杂度O(N^2)。因此整个排序的时间复杂度为堆排序的时间复杂度加上调整的时间复杂度:O(N。在极端情况下,每个点都进行向下调整的话,调整的时间复杂度是O(N。也就是求前K个最大的或者最小的数。最小的K个数来了,一定比堆顶的数大,就可以进堆。

2024-09-13 15:30:56 196

原创 建堆内容的实现

父亲的下标是P,则左孩子的下标为 lc = 2P + 1,右孩子的下标为 rc = 2P + 2。C是左还是右孩子无所谓。因此,堆排序排升序得建大堆。堆排序的时间复杂度是O(longN)。大堆只需要把子节点的大的值选出来往上调就是大堆的构造。堆排序:需要先建堆,排升序建大堆。当数组不是小堆后->创建小堆。

2024-09-12 15:56:38 122

原创 二叉树和堆概念

假设度为0的节点有a0个,度为1的节点有a1,度为2的节点有a2个,767 = a0 + a1 + a2 = 2a0 + a1 - 1,如果a1 = 1,则不匹配左边,所以a1 = 0。若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=Log2(n+1). (ps:Log2(n+1)是log以2为。假设度为0的节点有a0个,度为1的节点有a1,度为2的节点有a2个,所以2n = a0+a1+a2。即:K层的树,前K-1层都是满的,只有K层不满,但最后一层是需要从左到右连续的。层数是从1开始数的。

2024-09-12 14:24:29 560

原创 树的一些内容

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;如上图:B是A的孩子节点。叶节点或终端节点:度为0的节点称为叶节点;子孙:以某节点为根的子树中任一节点都称为该节点的子孙。非终端节点或分支节点:度不为0的节点;兄弟节点:具有相同父节点的节点互称为兄弟节点;节点的祖先:从根到该节点所经分支上的所有节点;节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;节点的度:一个节点含有的子树的个数称为该节点的度;

2024-09-12 12:38:26 159

原创 实现支持动态增长的栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则(对于同时在栈里面的数据,后进栈的必须先出栈)。如果用单链表作为结构,每次进行数据的头插,让头插的数据作为新的头,为栈顶,让以前进入的数据为栈低。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出。出3后,不可能出1,因为2卡着。

2024-09-11 18:18:30 133

原创 顺序表和链表的优缺点对比

2.CPU高速缓存命中率比较高(CPU通过寄存器在内存中遍历顺序表和链表的过程中,顺序表的速度比较快。数据在寄存器缓存中,称为命中,不在缓存不叫命中。因为顺序表空间连续,如果一次加载16byte,可以把顺序表很多数据都换存进去,但是链表空间不连续,他不太会被一次缓存进去。链表是低命中还存在缓存污染。1.按需求申请内存,需要存一个数据就申请一块内存,也不存在浪费。2.在头部和中间插入数据,需要挪动数据,效率低,O(N)2. 在任意位置O(1)的时间内插入删除数据。1.不支持下标的随机访问。

2024-09-10 13:01:24 141

原创 带头双向循环链表

双向带头循环链表每次传一级指针就可以了,因为带头,每次头可以指对方向。ListInsert和ListErase比较好用,可以复用删除和插入所有位置。

2024-09-09 17:04:51 207

原创 链表题目解析

链表题目

2024-09-09 12:37:39 307

原创 链表的结构及单向不带头不循环链表

单项不带头不循环(对于下述代码的pplist参数,均需要在创建节点后,对结点指针再传递指针,也就是需要传递二级指针(&plist)进行使用。双向链表:具有数据域和指针域,分别有指针域指向下一个节点和上一个节点的地址。单链表的结构:具有数据域和指针域,指针域指向下一个节点的地址。phead:头指针 存放链表的第一个节点的地址。单链表带头节点的结构,头节点不存放有效数据。循环链表:最后一个节点指向头节点。但其实数据的存储不连续。1.无头单向非循环链表,2.带头双向循环链表,

2024-09-04 22:09:59 161

原创 布隆过滤器和位图

hash

2022-01-19 22:20:20 339

原创 信号量:基于semaphore中sem值设置为1,构造一个拟互斥锁

用sem(1)初始化,构造一个互斥锁的抢票系统

2021-12-01 21:20:37 176

原创 linux生产者消费者模型

linux实现一个线程间的合作处理。对于线程c,p。。。。c是消费者,p是生产者。生产一批数据然后消费。每次得有阻塞等待线程锁被唤醒。这里的参数就不是数据了而是一个执行流代码实现如下:Task.hpp代码 1 #include <iostream> 2 using namespace std; 3 4 5 class Task 6 { 7 public: 8 Task(int x,int y,char op) 9

2021-11-29 23:13:38 376

原创 【无标题】

linux线程等待,cond和lock配合使用小练习 1 #include <iostream> 2 using namespace std; 3 #include <pthread.h> 4 #include <string>

2021-11-28 23:25:43 65

原创 linux-信号

信号闹钟操作 alarm(n) 闹钟,等s之后跳到闹钟结束进程linux 代码:让进程在1s后听到闹钟停止,打印count; 如果这1s内连续打印,因为有i/o count只到十几万,但是1s中自增时候没有打印,可以到几亿; 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 #inc

2021-11-13 17:47:59 858 1

原创 信号 kill -l

信号的linux操作13行:signal是重定义自定义哪个信号的怎样执行方法。这样子重定义之后,2号信号就不是中断了,而是打印上面的信息,我只是随便写了个,以方便测试。18行://这个代码是测试过core文件的截取,截取到后可以直接追踪到该错误信息处。//ulimit -a 查看core文件截取的方法是否打开,//ulimit -c (大小) 用来开启 core file size 的大小。 2 #include <stdio.h> 3 #include <sig

2021-11-10 22:52:02 751

原创 走迷宫问题。。字符串距离

字符串距离也是用str1的每个数据和str2比较,一层一层的下去 从每层元素的左边和上边两个位置找到最近的的位置,这样都能保证最后走到的是最小的位置,想起来可能比较抽象,但是画图之后,想想确实是这个道理。代码如下://字符串的距离int min(int x, int y){ return x < y ? x : y;}int main(){ string str1, str2; while (cin >> str1 >> str2) { int le

2021-11-09 19:48:27 76

原创 输出两个字符串的相同字符串的个数

eg:asdfaswerasdfaswer输出6我是用两个指针来操作的xs是长的字符串,ns是短的那个。因为每次从短的开始,遍历长字符串开始的头部,大的需要遍历短字符串的元素个数次。小的 每次从短的开始便利长字符串,相同啧开始一同向后遍历,如果长的不会遍历完全,则需要让短的在指向刚开始,长的从上次遍历的下一个位置开始遍历。#include <iostream>#include <string>using namespace std;int main(){ s

2021-11-03 18:46:17 972

原创 练习题,做错的不会的

一static int a = 1;void fun1(){ a = 2; }void fun2(){ int a = 3; }void fun3(){ static int a = 4; }int main(){ printf("%d", a); fun1(); printf("%d", a); fun2(); printf("%d", a); fun3(); printf("%d", a); return 0; // 1 2 2 2}static局部变量一旦成

2021-10-28 17:25:02 83

原创 跳石板问题,和一些选择题。

跳石板正确解法void get_div_num(int q, vector<int>& a){ for (int i = 2; i <= sqrt(q); ++i) { if (q%i == 0) { a.push_back(i); if (q / i != i) a.push_back(q / i); } }}int Jump(int n, int m){ vector<int > step(m + 1, INT_

2021-10-27 16:24:04 72

原创 linux进程间通讯,(父子进程间)

管道通讯(父读子写)互斥:任何时刻只能有一个人正在使用某种资源管道内部自动提供了互斥与同步机制如果写端关闭,读端就会read返回值0,代表文件结束如果打开文件的进程退出,文件也会被释放文件的生命周期随进程<管道的流式服务>管道是半双工,就是数据只可以向一个方向流动匿名管道,适合具有血缘关系的进程进行进程间通讯read :没有内容挂起write:没有空间挂起如若管道没有父进程读,就会读文件错误。read关闭,一直写,写方(child)被操作系统杀掉,写入无意义linux实

2021-10-25 22:27:13 592

原创 做题修正的正确答案

求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 空间复杂度O(1)这个是不能是负数的操作,如果是负数,一直补符号位导致无法结束循环。int Max(int a, int b){ return a > b ? a : b;}int main(){ int num; while (cin >> num) { int count = 0, max_count = 0; while (num) { if

2021-10-25 19:34:45 165

原创 2021-10-19

求连续子数组最大和int Getmax(int a, int b){ return a > b ? a : b;}int main(){ int size = 0; cin >> size; vector<int> nums(size); for (int i = 0; i < size; ++i) { cin >> nums[i]; } int sum = nums[0]; int max = nums[0]; for

2021-10-19 22:46:54 102

原创 红黑树的插入和删除

RBTRee 插入节点:首先用BSTree的方法构造节点,然后创建一个真实的空节点,让所有没有真是子节点的节点都指向这个真实的空节点,而不是nullptr。插入之后的调平颜色和高度是问题的关键。以左子树为例,右子树为镜像操作。先找到叔伯节点,若叔伯节点不为空且颜色为红色,则父节点颜色改为黑色,叔伯节点变为黑色,爷爷节点变为红色,然后插入节点由原来的位置变成爷爷节点,然后向上回溯。这是一种情况。左边的直线插入 ‘ / ’ ,将父节点的颜色变为黑色,爷爷节点的颜色变成红色,然后进行一个右单旋转。如果是

2021-08-04 23:43:32 132 1

原创 AVLTree的编写规则

AVLTree 高度平衡的二叉搜索树 平衡因子 bf = rh - lh即利用bf=根节点的右树长度-左树长度的正负值,来将极端情况下的BSTree调节平衡。在AVLTree中,调节过程需要用到stack,stack先把插入的地址都存入栈中,直到不平衡出栈,找到父节点。‘ \ ’ 左单旋转 , ‘ / ’ 右单旋转 。‘ > '先右后左 , ‘ < ’ 先左后右 。Remove 的节点 最多只能有一个子女节点,如果没有,利用左右子节点调整数值。本次利用找到左子树的右子树的最大值

2021-08-02 23:00:27 80

原创 继承---目的:复用代码

继承:可以理解为将弗雷德代码拷贝一份给子类,但是构造和析构函数不可以继承。子类可直接调用父类的方法(公有方法)。保护方法可以在子类中用子类的方法调用父类的保护方法。保护继承会将父类的公有方法变成保护方法。(私有同样的性质 继承最小性原则)。父类的私有数据不可以访问如果不写继承方法,则默认为私有继承。struct是公有继承’复制件用性原则:子类对象可以以对象,指针,引用的方法给父类赋值。子类与父类有同名的方法则用子类访问时,访问的是子类的方法如果同名方法中子类给父类赋值后,同名访问父类方法

2021-07-19 00:12:59 75

原创 剑指offer 求1+2+3+...+n

要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)class Solution {public: class Sum { public: Sum() { _sum += _i; _i++; } }; int Sum_Solution(int n) { _i = 1;

2021-06-18 15:42:00 52

原创 文件管理操作之c++版本 cpp和流操作

首先来看一下c语言的操作//c语言的写入void main(){ int ar[] = { 10, 11, 22, 33, 44, 55, 66, 77, 88, 99 }; int size = sizeof(ar) / sizeof(ar[0]); FILE* fp = fopen("Test1.txt", "w"); assert(fp!=NULL); // "w" 是写入,创建一个fp的txt 功能是写入 for (int i = 0; i < size; ++i) {

2021-06-17 21:22:38 211

原创 模板的使用

先来个模板的随便使用template<typename Type, size_t _N=8>class SeqList{public: SeqList(int sz = SZ_SZIE) { capacity = sz > SZ_SIZE ? sz : SZ_SIZE; base = new Type[capacity]; size = 0; }private: enum{SZ_SIZE = 8};private: Type* base; size_t

2021-06-15 23:40:08 71

原创 priority_queue实现

废话不多说,直接上实现的代码要想实现这个,对于优先级的把控,操作得理解清楚相信各位看官仔细想想看我的注释,应该会看懂namespace ghc{ template<class T,class Container = vector<T>,class Compare = less<T>> class priority_queue { public: priority_queue(const T* first, const T* last, const Co

2021-06-11 00:08:07 125

原创 stack_queue的详细解释和使用

stack是栈,没有迭代器,以下是相关代码测试; //stack容器适配器 没有迭代器 不能用auto top:栈顶 pop:出栈namespace ghc{ template<class _Ty> class stack { public: stack()//list自己会做 {} ~stack()//list自己会做 {} public: bool empty()const { return _C.empty(); } size_t s

2021-05-24 15:32:41 165

原创 string的实现

因为代码中为了符合规范的函数名称,很多整数用size_t,但是操作时为了方便,不考虑-1,用int。代码的整体思路和链表的实现没有太大差距。新人学习所写,请酌情批评。#include<iostream>#include<assert.h>using namespace std;namespace ghc{ class string { friend ostream& operator<<(ostream& out, const str

2021-05-15 14:09:12 94

原创 list的c++实现

第一次写list的实现 要是有不小心错了的地方,请留言改正创建迭代器类,实质上就是封装一个节点指针,通过节点指针实现操作,至少要实现的操作符已说明。这两个类都要设置List为友元类,因为这样才能用List直接操作迭代器的相关操作。创建一个类,用来存放list的内容,不过可以用struct来代替,list可以写入初始值的构造和析构可暂时将迭代器理解成一个指针,该指针指向list中的某个节点迭代器中的函数用来进行各种基础操作写的不是很详细,不是很齐全。所写代码如下namespace ghc{

2021-04-21 16:40:56 133

原创 list和vector的小操作,刚学的,写写简单的操作

//使用list或者vector中的函数时候,得在前面加上关键字//实验vectorvoid main(){ vector<int> iv(5, 1); iv.reserve(100); // for (int i = 1; i <= 100; ++i) { iv.push_back(i); cout << "capacity = " << iv.capacity() << " "; } cout << endl;

2021-04-20 22:58:43 59

原创 list类,模板的操作

以下是总体的解释,代码处都有标识。首先定义一个模板类 用_Ty, 因为类型不同的类,所以统一用宏定义一些类型名。构造函数要用显示构造,针对于节点 写了三个函数操作定义了三个函数 伺候_Next的三个域 静态函数可以不通过对象调动,通过类名就可以调动既然已经写了_Acc所以在进行对创建的链表的前后指向操作时,用_Acc来找购买结点指针创建一个指针指向开辟的_Nodenamespace ghc{ template<class _Ty> class list { publi

2021-04-01 22:23:01 277

原创 模板

模板的存在是为了解决代码的冗余(重复性) 把类型当作参数传递,关键字 template例如交换函数本来这里需要写三个不同类型的函数,但是使用模板之后,只用写一个template<class Type>void Swap(Type& a, Type& b){ Type tmp = a; a = b; b = tmp;}void main(){ int a = 10; int b = 20; Swap(a, b); double c = 12.34;

2021-03-28 22:37:17 40

原创 对于class的浅拷贝的操作方法

因为深拷贝的资源浪费,所以相对于深拷贝,我们更希望浅拷贝的形式,但是浅拷贝又会有各种改动会引起所有的值变化,所以今天参考前人创作,写出如下代码。这个是最顶部 且用来存放数据的代码区域,相当于分装。因为上篇刚写到new,所以此处用new创造空间此处放一个计数器countincrement是用来统计 如果加一个指向 则count++decrement是用来 减少一个指向 则count–class String_rep{ friend class String;public: String_r

2021-03-24 17:59:30 254

原创 内存管理,new,delete的分析

*short ar[100] sizeof(ar)==400; (这是一个指针数组)局部变量 函数参数 在栈 (堆栈指的在栈区)malloc和new在堆中全局变量静态变量在静态常量区(数据段)如下图new和delete操作符new 1申请空间 2.调动构造函数new会调用构造函数 malloc不会delete 1.调动析构函数 2.释放空间delete会调用析构函数 free不会new如果想创建很多个构造函数 则必须有初始值 如果想给赋值,则只能调用一次函数构造和析构必须对等/

2021-03-22 23:07:36 67

原创 类成员的静态成员,友元函数,统计类的个数

各个描述下边就是代码,想试试的大哥可以试试普通方法可以调常方法,反过来不行;因为对this指针的限定不同普通方法可以调动静态方法,反过来不行;静态成员没有this指针静态方法可以用 类:: 调动//静态对象class Test{public: Test() :m_data(0) {}public: void fun() { m_data = 1; m_value = 10; print(); show(); } static void show() {

2021-03-21 23:00:18 217

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除