自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一个好人的博客

苦逼计算机研究生

  • 博客(76)
  • 收藏
  • 关注

原创 dpdk最细流程,包含虚拟机安装dpdk

安装dpdk超详细过程,包含虚拟机安装dpdk过程

2022-07-15 11:18:44 3127

原创 程序员的自我修养5 共享库的组织

第五章 : linux共享库的组织1. 共享库版本1.1 共享库版本命名libname.so.x.y.zlib是固定前缀name是共享库的名字so是固定后缀x : 主版本号y : 次版本号z : 发布版本号主版本号 : 重大更新,会修改共享库的原有接口,和之前的版本无法兼容,用到该共享库的程序需要重新编译,在可以运行,或者,系统保留旧版本共享库使得依赖旧版本共享库的程序可以依然正常运行次版本号 : 增量更新,不修改共享库的原有接口,在原有接口基础上,添加一些新的接口,和之前

2021-09-16 21:57:17 216

原创 程序员的自我修养4.1 动态链接的过程和延迟绑定

1 动态链接的过程注意 : 程序员的自我修养的动态链接部分很多地方不容易理解,我读完之后发现,先从宏观角度,了解整个动态链接的过程,之后再了解动态链接的相关结构,各个段的具体作用反而效果更好,所以,本文先介绍动态链接的过程,其中可能会提到一些段比如.dynamic等等,先把疑问记下,之后的文章会说明的,先了解整体的执行过程为主1.1 进程将控制权交给动态链接器1.2 动态链接器进行自举自举 : 动态链接器实现的功能是将主模块和共享对象链接在一起,链接的过程中对共享对象进行重定位,之后就可以调用共享

2021-09-14 22:57:11 235

原创 c++实现二叉树,包括先序中序遍历,添加删除节点以及析构

BinaryTree.h#include<iostream>using namespace std;class TreeNode{public: TreeNode* left; TreeNode* right; int val; TreeNode(int val); TreeNode(int val, TreeNode* left, TreeNode* right); void preOrder(); void infixOrder(); void myDestru.

2021-09-14 15:42:04 327

原创 1. 使用c++实现单链表(模板编程),包括析构函数,尾插法和头插法

因为vs中,涉及到模板类的时候不能分文件编写,而是将定义和声明都写到一个文件中,这个文件约定俗成,后缀名为.hpp所有用new创建的元素,都要在析构函数中,释放掉对应的内存空间,否则会造成内存泄漏LinkedList.hpp#pragma once#include<iostream>using namespace std;//节点类template<class DateType>class Node{public: Node<DateType>.

2021-09-10 21:56:56 940 1

原创 程序员的自我修养3.4 linux内核装载ELF过程

4.5 linux内核装载ELF过程当我们在linux系统bash下输入一个命令执行ELF程序的时候,过程是怎样的?bash调用fork()系统调用创建一个进程,然后该新进程调用execve()系统调用execve系统调用的入口是sys_execve(),它负责参数的检查复制,完成后调用do_execve()do_execve()读取文件的前128个字节,因为每种可执行文件的前128个字节的数据可以帮助我们知道则个文件是什么格式的,尤其是前4个字节(常常称之为魔数),比如ELF文件头的前四个字

2021-09-08 20:23:37 198

原创 程序员的自我修养3.3 进程栈初始化

4.4 进程栈初始化进程运行之前,我们需要准备好系统环境变量和运行参数,最常见的作法是操作系统在进程启动之前将这些信息提前保存到进程的虚拟空间的栈中

2021-09-08 20:22:56 117

原创 程序员的自我修养3.2 段地址对齐

4.3段地址对齐我们装载以段为基本单位划分,使得内存的利用率提升了,但是我们总是要一直追求内存的利用率不断提升的,比我们继续分析,假如有三个段,大小分别为127,9899,1988,那么他们分别需要1,3,1个页,一共需要5个页,但是每个页都存在页内碎片,尤其是第一个段,仅仅127的大小,却要给其分配一整个页,三个段大小一共是12014字节,但是却需要20480字节的空间,空间使用率只有58.6%,所以我们继续思考如何提高内存利用率一般大部分unix系统采用的都是相邻页合并的方法,注意 : 我们

2021-09-08 20:21:37 647 2

原创 程序员的自我修养3.1可执行文件的装载过程

可执行文件的装载与进程所谓装载,就是把可执行文件装入内存中执行解决的问题ELF文件在linux下的装载流程可执行文件装载的本质是什么什么是进程的虚拟空间为什么进程要有自己的虚拟空间装载的几种方式虚拟地址空间的分布情况预备知识:进程空间的栈和堆程序在内存分步中,除了之前知道的.data,.text,.bss等段之外,还有两个非常重要的内容,堆和栈栈(stack) : 由编译器自动分配和释放,存放函数的参数值,局部变量的值,其操作方式类似于数据结构中的栈,先进先出的原则堆(h

2021-09-08 19:41:04 327 3

原创 程序员的自我修养0

导师给了一个书籍清单,其中<<程序员的自我修养>>这本书旁边写了个必修,想来是非常重要的书籍了,所以,我决定花时间啃完这本书,并且把重要的内容做成笔记,分享到csdn阅读该书需要的前置知识操作系统计算机组成原理linux,我之前有发布过linux文章,把那个文章看完即可c++/c需要提前知道的一些小知识点北桥芯片(North birdge/PCI bridge) : 随着图形化操作系统的普及,游戏是3d游戏和多媒体的发展,慢速的i/o总线以及无法满足图形设备.

2021-09-07 18:43:26 85

原创 程序员的自我修养2.2 .COMMENT块

COMMNET块之前说过,.bss段存放未初始化的变量,不占据实际的文件大小,但是要分配虚拟地址空间,所以我们依然要知道这些未初始化的变量大小是多少,这个时候就存在一个问题 : 我们之前讲过,全局符号存在强符号和弱符号之分,未初始化的全局符号默认为弱符号,并且强弱符号之间存在一定的规则强符号不允许重复定义如果存在一个强符号和多个弱符号,选择强符号如果有多个弱符号,选择占据空间大的并且要知道,我们的编译后的目标文件会产生各自段,但是编译是针对一个文件的,他可以判断该文件的符号是强符号还是弱符

2021-09-07 18:29:32 245

原创 程序员的自我修养2.1 静态链接-两步链接

静态链接本文需要用到的代码#include<stdio.h>int global_init_val = 84; //.dataint global_uninit_val;__attribute__((section("FOO"))) int global = 42;//FOOint main(){ int init_a = 20; int uninit_b; static int static_b = 40;//.data

2021-09-07 18:27:39 93

原创 程序员的自我修养1 ELF文件结构

ELF文件结构1. ELF文件头readelf -h hello2.o 可以查看ELF文件头ELF 头:Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 类别: ELF64数据: 2 补码,小端序 (little endian)版本: 1 (current)O

2021-09-07 10:25:46 190

原创 linux基础内容,掌握这些基本可以流畅的使用linux系统

linux初识cd /opt 进入opt目录tar -zxvf xx.tar.gz 解压./xx-install.pl 安装pwd 显示当前用户在哪个目录linux中,隐藏文件是以.开头的ls 可以查看当前目录的内容,包括文件和文件夹ls -a 显示隐藏文件ls -l 单列(详细的)显示目录内容ls -al 混合显示ls -al /root 单列显示root的所有文件linux目录结构介绍linux只有没有盘符,只有一个根目录/,windows中,我们可以

2021-09-04 13:47:48 640

原创 自己学习c++过程中写下的笔记,只做基础了解使用

01书写helloworld#include <iostream>using namespace std;int main() { cout << "Hello World" << endl; system("pause"); return 0;}02变量创建的方法#include <iostream>using namespace std;int main() { //变量创建的方法 int a = 10; c

2021-08-22 14:57:40 542

原创 12- 图

12-图12.1-图的基本介绍导言:线性表:一对一树:一对多图:多对多图是一种数据结构,其中结点可以有零个或多个相邻元素,而两个结点之间的连接称为边,结点也可以称为顶点分类有向图无向图带权图(网)图的表示方式邻接矩阵(二维数组),适合用于稠密图(边比较多的图),邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都不存在,会造成空间的一定损失邻接表(链表+数组),适合用于稀疏图(边比较少的图),邻接表只关心存在的边,不关心不存在的边,因此没有空间的浪费12

2021-07-22 09:27:08 80

原创 10.5-平衡二叉树(AVL)

10.5-平衡二叉树(AVL)导言:给定一个数列,依据此数列构建的二叉排序树可以有多个,甚至有结构上类似单链表这种情况,而当二叉排序树的结构类似单链表的时候,会导致我们的查找效率变得很低,甚至比单链表的速度还要慢,这个时候,我们就引入一个新的概念, 平衡二叉树AVL基本介绍平衡二叉树也叫平衡二叉搜索树,可以保证查找效率较高具有以下特点,他要么是一棵空树,要么他的左右子树的高度差绝对值不超过1,并且左右子树也满足平衡二叉树的定义,平衡二叉树的常用实现方法有红黑树,AVL,替罪羊树,Treap,伸展

2021-07-12 15:58:06 100

原创 10.4-二叉排序树

10.4-二叉排序树导言:针对一个数列{7,3,10,12,5,1,9},要求可以高效的完成数据的查询和添加数组无序数组:查找速度慢,但是添加的时候可以直接添加到数组尾部,快速有序:可以使用二分查找,查找速度快,但是添加的时候为了保证数组有序,可能要移动大量元素,速度慢链表:不论有序无序,查找速度都不快,但是添加速度快二叉排序树:既可以保证数据的检索速度,也可以保证数据插入删除修改的速度二叉排序树介绍:对于二叉排序树的如何一个非叶子结点,要求左子树的值比当前结点的值小,右子节

2021-07-12 15:57:32 94

原创 10.3-霍夫曼编码

10.3-霍夫曼编码基本介绍:赫夫曼编码也翻译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码定长编码以及定长编码的问题霍夫曼编码压缩文件,对于已经压缩过的,或者重复内容不多的文件,压缩效果并不明显通信领域中信息

2021-07-12 15:56:59 403

原创 10.2-霍夫曼树

10.2-霍夫曼树给定n个叶子结点,构建出一颗二叉树,这个二叉树的特点是带权路径长度(WPL)最小,权值较大的叶子节点离根节点越近注意:给定结点,霍夫曼树可能依据构建的排序方式不同,可能会有多个树形态,但是WPL一定是一样的,都是最小的,那么依据霍夫曼编码压缩的二进制文本,内容可能有差异,但是长度是一定一样长的案例给定一个数组,将其转为霍夫曼树思路:首先,给定的是一个数组,我们需要先根据数组,创造出对应的Node结点,然后将这些结点防止到一个集合当中对集合进行排序首先,取出集合中最小

2021-07-12 15:56:29 116

原创 9.3-线索化二叉树

9.3-线索化二叉树二叉树中,我们会发现一个问题,就是会存在空指针域,因为不是每个结点都有左右结点,所以这个时候会造成空间浪费,为了减少这种不必要的浪费,我们将这些空指针域,指向某一遍历次序下,当前结点的前驱和后续结点,那么我们就将一个二叉树转化成了线索化二叉树二叉树有n个结点,则有n+1个空指针域package com.hejiale.dataStructures.tree.threadBinaryTree;public class ThreadBinaryTree { privat

2021-07-12 15:55:56 55

原创 9.2-顺序存储二叉树(堆排序)

9.2-顺序存储二叉树(堆排序)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rw66nxI-1626076516256)(…/images/3feb6d32db0055a75332ae9d210b49cb6eda7a8f04167465dc9409c20caab50c.png)]就是用数组存储二叉树,通常我们只考虑完全二叉树,因为别的树会产生空间的浪费使用数组存储二叉树有很多好处,比如说通过下标,就可以表示结点之间的关系,比如第n个元素的左孩子为第2n个,右孩子为

2021-07-12 15:55:23 69

原创 8-哈希表

8-哈希表8.1-哈希表基本原理[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Xs2tUd7-1626076437479)(…/images/72834d33a6a82c8672b4bd18974ea512c6442088ed7855ab3a0d2b77ff4a7a30.png)]8.2-哈希表(散列) Google上机题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uJcW7BJj-1626076437482)(…/image

2021-07-12 15:54:07 166

原创 9.1-二叉树(java实现)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Gx2cL0c-1626076386540)(…/images/0160aaea18cbcdf8ec9aefeede7b27f34deecba031f896ecee5ad0064ca77d6b.png)]9.1-二叉树public class BinaryTree { private HeroNode root;//根结点 public BinaryTree(HeroNode root) {

2021-07-12 15:53:16 36

原创 6.8-堆排序

6.8-堆排序堆:堆是具有以下性质的完全二叉树,每个结点的值都大于或等于其左右结点的值,称之为大顶堆,注意:没有要求左右结点之间的值的大小关系,只要都小于父结点即可大顶堆小顶堆堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,他的最好,最坏,平均时间复杂度均为O(log2N),是不稳定排序堆排序的基本思想是:将待排序序列构造成一个大顶堆此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这

2021-06-23 08:56:15 111

原创 7.4-斐波那契查找:通俗易懂理解

package com.hejiale.arithmetic.search;import java.util.Arrays;/* 斐波那契查找算法也是针对二分查找的,只不过类似于插值查找,我们又是修改的求mid的公式 1. 首先,说明白斐波那契数列,斐波那契数列的特点是,当下标大于等与2的时候,f[k]=f[k-1]+f[k-2],首先给一个 斐波那契数列方便理解 {1 1 2 3 5 8

2021-06-15 14:34:40 160

原创 7.3-插值查找

package com.hejiale.arithmetic.search;import java.util.ArrayList;import java.util.List;/* 插值查找其实就是二分查找的改良版本,针对的是我们mid的取值进行改良,所以插值查找算法也要求数组是有序的 在二分查找中,如果查找的数组是均匀分布的,而我们查找的又恰巧是边界附近的值的时候,效率是比较低的 所以,我们将 mid = (low+high)/2

2021-06-14 23:00:22 76

原创 7.2-二分查找以及二分查找的优化:当有多处匹配的时候返回全部下标

package com.hejiale.arithmetic.search;import java.util.ArrayList;import java.util.List;/* 二分查找: 1. 首先说明,二分查找只适用于有序表查找 2. 当我们要查找的值,在数组中有多个匹配时,二分查找返回的下标很有可能不是该元素第一次出现时候的下标,比如 二分查找 {1, 1, 1, 1, 1, 1, 12, 22, 31, 43, 67,

2021-06-14 22:21:37 79

原创 6.7-基数排序

package com.hejiale.arithmetic.sort;import java.util.Arrays;/* 基数排序(桶排序的扩展):非常特殊的一个排序,因为之前学习的排序算法都是基于比较的,而基数排序是不基于比较的排序算法*/public class RadixSort { public static void main(String[] args) { int[] arr = {53, 3, 542, 748, 14, 214};

2021-06-14 18:38:03 58

原创 6.6-归并排序

package com.hejiale.arithmetic.sort.bubble;import java.util.Arrays;/* 脑海中要有归并数和栈的概念,才可以很好的理解归并排序*/public class MergeSort { static int[] arr = {8, 4, 5, 7, 1, 3, 6, 2}; static int[] temp = new int[arr.length]; public static void main(St

2021-06-14 16:34:48 128

原创 6.5-快速排序

package com.hejiale.arithmetic.sort.bubble;import java.util.Arrays;public class QuickSort { public static void main(String[] args) { int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21, -21}; /* 快速排序:

2021-06-13 23:17:36 103

原创 6.4-希尔排序

package com.hejiale.arithmetic.sort.bubble;import java.util.Arrays;/* 希尔排序和直接插入排序都属于插入排序,但是在直接插入排序当中,存在一个问题,就是待插入元素是一个较小的数的时候,后移的次数明显回 增加,对效率会产生影响 希尔排序是简单插入排序经过改进后的一个更高效的版本,也成为缩小增量排序*/public class ShellSort { public static void main(S

2021-06-13 21:58:49 190

原创 6.3-直接插入排序

package com.hejiale.arithmetic.sort.bubble;import java.util.Arrays;public class InsertSort { public static void main(String[] args) { int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21,-21}; /* 直接插入排序思路:

2021-06-13 16:13:17 183

原创 6.2-简单选择排序

package com.hejiale.arithmetic.sort.bubble;import java.util.Arrays;public class SelectSort { public static void main(String[] args) { int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21,-21}; //简单选择排序 select(arr);

2021-06-13 13:09:48 213

原创 6.1-冒泡排序

package com.hejiale.arithmetic.sort.bubble;public class BubbleSort { static int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21}; public static void main(String[] args) { /* 1. 冒泡排序的思路: 冒泡排序通过元素两两的依次比较,每

2021-06-13 12:33:14 463

原创 5-栈以及八皇后问题

5-递归(Recursion)5.1-递归应用场景迷宫问题5.2-递归的概念简单地说,递归就是方法自己调用自己,每次调入的时候传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁5.3-递归调用机制[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wX2XMtTz-1623323296334)(…/images/f76dafb65db425a4a1cc0538a8c62f111835a8bf6e5e420a82ccfce8b412bd53.p

2021-06-10 19:08:55 128

原创 4.8-中缀表达式转后缀表达式

4.8-中缀表达式转后缀表达式步骤首先,准备一个栈扫描中缀表达式,若扫描到数字,直接将其加入后缀表达式若扫描到界限符()若为( 入栈若为) 则依次弹出栈中所有的运算符加入后缀表达式,直到弹出(,或栈空若扫描到运算符先依次弹出栈中,优先级大于等于当前运算符的运算符加入后缀表达式然后将当前运算符入栈代码实现package com.hejiale.Stack.v5;public class Operation { private static int ADD

2021-06-09 18:18:08 59

原创 4.7-逆波兰计算(后缀表达式):完成一个逆波兰计算器,分析和代码实现

4.7-逆波兰计算(后缀表达式):完成一个逆波兰计算器,分析和代码实现要求完成以下任务输入一个逆波兰表达式(后缀表达式),使用栈,计算其结果支持小括号和多位整数思路分析代码完成package com.hejiale.stack.v4;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class PolandNotation { public static vo

2021-06-09 18:17:38 79

原创 4.6-前缀,中缀,后缀表达式

三种表达式前缀表达式–>波兰表达式后缀表达式–>逆波兰表达式中缀表达式–>我们最常见的表达式就是中缀表达式,前缀表达式和后缀表达式的特点是都只有一种运算次序,但是中缀表达式的运算次序不唯一前缀表达式计算步骤从右至左扫描表达式,遇到数字的时候,将数字压入堆栈,遇到操作符的时候,依次弹出栈顶元素和次顶元素(栈顶元素 操作符 次顶元素,这里要注意,后缀表达式和他相反),用运算符做出相应的计算后,将结果入栈,重复上述步骤直到表达式最左端,最后计算出的值就是表达式的结果中缀.

2021-06-08 23:43:16 82

原创 4.7-逆波兰表达式计算器

4.7-逆波兰计算(后缀表达式):完成一个逆波兰计算器,分析和代码实现要求完成以下任务输入一个逆波兰表达式(后缀表达式),使用栈,计算其结果支持小括号和多位整数思路分析代码完成package com.hejiale.Stack.v4;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class PolandNotation { public static vo

2021-06-08 23:42:31 153

空空如也

空空如也

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

TA关注的人

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