![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
瑞-板凳精神
星光不问赶路人-你可以不平凡
展开
-
数据结构——跳表和散列
虽然在n个元素的有序数组上折半查找所需要的时间为O(logn),但是在有序链表上查找所需要的时间为O(n)。为了提高有序链表的查找性能,可以在全部或部分节点上增加额外的指针。在查找时,通过这些指针,可以跳过链表的若千个节点,不必从左到右连续查看所有节点。增加了额外的向前指针的链表叫做跳表(skiplist)。它采用随机技术来决定链表的哪些节点应增加向前指针,以及增加多少个指针。基于这种随机技术,跳表的查找、插入、删除的平均时间复杂度为O(logn)。然而,最坏情况下的时间复杂度却变成O(n)。散列是.原创 2021-04-16 12:00:26 · 750 阅读 · 2 评论 -
-栈的应用-
计算机是如何执行递归函数的呢? 答案是使用递归工作栈(recursion stack)。当一个函数被调用时,一个返回地址( 即被调函数一旦执行完,接下去要执行的程序指令的地址)和被调函数的局部变量和形参的值都要存储在递归工作栈中。当执行一次返回时,被调函数的局部变量和形参的值被恢复为调用之前的值(这些值存储在递归工作栈的顶部),而且程序从返回地址处继续执行,这个返回地址也存储在递归工作栈的顶部。如果把数组线性表的右端定义为栈顶,那么入栈和出栈操作对应的就是线性表在最好情况下的插入和删除操作。结果两个.原创 2021-04-14 17:40:55 · 206 阅读 · 0 评论 -
数组和矩阵
数组在图7-1中,从第一行开始,依次对每一行的索引从左至右连续编号,得到图7-2a所示的映射结果。它把二维数组的索引映射为[0,n-1]中的数,这种映射方式称为行主映射( row major mapping)。索引对应的数称为行主次序( row-major order)。图7-2b是另一种映射模式,称为列主映射图7-1 整型数组score [3] [6]的索引排列表( column major mapping)。在列主映射中,对索引的编号从最左列开始,依次对每一列的索引从上到下连续编号。在行主次序原创 2021-04-14 10:07:07 · 522 阅读 · 0 评论 -
_链表应用
箱子排序一种更快的排序方法是箱子排序( bin sort)。这种排序首先把分数相同的节点放在同一个箱子里,然后把箱子链接起来就得到有序的链表。我们需要n个箱子,每个箱子对应一个分数。每一个箱子都是一个链表箱子排序需要做的是:1.逐个删除输入链表的节点,把删除的节点分配到相应的箱子里;2.把每一个箱子中的链表收集并链接起来,使其成为一个有序链表。如果输入链表是链式类型,那么我们能够做的是: 1. 连续删除链表的首元素,并将其插入相应的某个箱子的链表首位; 2. 从最后一个箱子开始,逐个删除每原创 2021-04-13 18:39:17 · 139 阅读 · 0 评论 -
程序性能分析
空间复杂度该程序运行所需内存大小程序所需要的空间主要由以下部分构成:指令空间( instruction space ):是指编译之后的程序指令所需要的存储空间。数据空间( data space ):是指所有常量和变量值所需要的存储空间。它由两个部分构成: 1. 常量和简单变量所需要的存储空间。2. 动态数组和动态类实例等动态对象所需要的空间。环境栈空间( enyjronment stack space ):用来保存暂停的函数和方法在恢复运行时所需要的信息。每当一个函数被调用时, 下面原创 2021-04-09 11:58:26 · 179 阅读 · 0 评论 -
为一个二维数组分配空间
先分配行,再分配列二维数组x可以认为是:指向指针的指针 char **xtemplate <class T>void make2dArray(T ** &X, int numberOfRows, int numberOfColumns){ //创建一个二维数组 //创建行指针 x = new T * [numberOfRows] ; //为每一行分配空间 for (int i = 0; i < numberOfRows; i++) { x[i] = ne原创 2021-04-08 16:48:06 · 322 阅读 · 0 评论 -
工厂模式-
简单工厂模式属于类的创建型模型,又叫静态工厂方法模式。定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。工厂模式抽象工厂可以向客户端提供一个接口,使得客户端在不指定产品具体类型的情况下,能够创建多个产品族的产品对象。工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构。...原创 2021-03-19 10:35:26 · 685 阅读 · 0 评论 -
数据结构——栈(c++版)
栈原创 2021-03-18 16:58:16 · 103 阅读 · 0 评论 -
数据结构——链表(c++版)
将一个线性表插入到另一个中将所有的在线性表Lb中但不在La中的数据元素插入到La中*/void union (List *La,List Lb){ int La_len,Lb_len,i; ElemType e; /*声明与La和Lb相同的数据元素e*/ La_len = ListLength(La) ; /*求线性表的长度 */ Lb_len = ListLength (Lb) ; for( i=l; i<=Lb_len; i++ ) { GetElem(Lb, i,e)原创 2021-03-17 10:24:52 · 80 阅读 · 0 评论 -
数据结构——树
树节点的分类:节点拥有的子树数称为:节点的度(degree),度为0的节点称为叶节点(leaf)或终端节点,度不为0的节点称为非终端节点或分支节点。树的度是树内各节点度的最大值。二叉树的性质每个节点最多有两个子树。第i层有2^(i-1)个节点,深度为k的二叉树最多有2 ^(k)-1.度为2的节点数比叶子数多1。例如下图2中的数量关系为:1号+2号+3号+4号 = 8号+9号+10号。满二叉树:每个节点的度为2。完全二叉树:第k-1层和满二叉树一样,最后一层的叶子节原创 2021-03-16 09:08:31 · 87 阅读 · 0 评论 -
数据结构——队列(c语言版)
队列基本概念队列是一种先进先出(FIFO)特殊的线性表,仅在线性表的两端操作,不允许在中间操作。对头(front):取出元素的一端队尾(rear):插入元素的一端线性队列例子:依据单链表改造即可。#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>#include<windows.h>typedef struct Node{原创 2021-03-14 21:45:16 · 104 阅读 · 0 评论 -
栈的应用——后缀表达式
后缀表达式的定义实例(中缀转后缀):5+4=>5 4 +1+23 => 1 2 3 * +8+(3-1) 5 => 8 3 1-5 *+ +中缀表达式符合人类的阅读和思维习惯。后缀表达式符合计算机的“运算习惯”中缀转后缀算法:。遍历中缀表达式中的数字和符号:对于数字:直接输出4对于符号:。左括号:进栈运算符号:与栈顶符号进行优先级比较+若栈顶符号优先级低:此符合进栈(默认栈顶若是左括号, 左括号优先级最低)+若栈顶符号优先级不低:将栈顶符号弹出并输出,之原创 2021-03-14 17:17:38 · 190 阅读 · 0 评论 -
数据结构之——栈(c语言版)
栈的介绍栈是一种特殊的线性表,仅在线性表的一端操作(栈顶top)。插入操作:进栈、压栈、入栈。删除操作:出栈、弹栈。用线性表的顺序存储模拟栈时,在尾部添加或删除元素,不会涉及到元素的大量移动。用线性表的链式存储模拟栈,在头部插入或删除元素,不会涉及到元素的大量移动。栈的链式存储利用单链表结构创建栈(头插法):例子:#include<stdio.h>#include<malloc.h>#include<string.h>#include<原创 2021-03-14 16:46:22 · 92 阅读 · 0 评论 -
双向链表(c语言版)
双链表#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>typedef struct Node{ Node* pre; Node* next;}node;typedef struct Common_list{ node head; int length;}common_list;common_list*creat_double_li原创 2021-03-13 22:00:40 · 64 阅读 · 0 评论 -
循环链表(c语言版)
#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>#include<windows.h>typedef struct Node{ //定义连接链表的节点: Node* next;}node;typedef struct Common_list{ //定义一个空间域 node head; int length;}common_原创 2021-03-13 22:00:13 · 316 阅读 · 0 评论 -
单链表(c语言版)
模拟手机类型管理#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>typedef struct Phone{ int price; char brand[8]; //int price2; struct Phone *next;}phone;phone *insert(phone *old,phone *new_){ if (old ==原创 2021-03-10 20:27:50 · 281 阅读 · 0 评论 -
运算符重载练习
运算符重载#include <iostream>#include<string>#include<vector>#include<new>using namespace std;class Car;class Phone{private: string brand; int price; //char str[8];public: Phone(); Phone(const string &b,int pri); fr原创 2021-03-10 09:51:09 · 143 阅读 · 0 评论 -
c++类对象的例子(非标准语法;请使用 “&“ 来创建指向成员的指针,如何解决?)
Game.cpp......#include "Game.h"#include<iostream>#include<string>#include<time.h>#include<stdlib.h>#include<new>#include<typeinfo>#include<algorithm>Game::Game(){ cout << "begin to no paraments in原创 2021-03-09 11:23:16 · 811 阅读 · 0 评论 -
实现n的阶乘运算
在c++中利用递归调用实现阶乘# include<iostream>int factorial(int num){ if (num == 0) { return 1; } else { return num * factorial(num-1); }}void vivo4(){ cout << "input a number: "; int in_num; int result; while (cin>>in_num) {原创 2021-03-08 17:00:35 · 130 阅读 · 0 评论 -
c++中运算符和相对应的函数符
运算符和相应的函数符+:plus-:minus*:multiplies/:divides%:modulus-:negate==:equal_to!=:not_equal_to>:greater<:less>=:greater_equal<=:less_equal&&:logical_and||:logical_or!:logical_not...原创 2021-03-07 15:09:58 · 160 阅读 · 0 评论 -
c++中基于范围的for循环
for_each(books.begin(), books.end(), ShowReview);可将其替换为下述基于范围的for循环:for (auto x : books) ShowReview(x);根据book的类型(vector< Review>),编译器将推断出x的类型为Review,而循环将依次将books中的每个Review对象传递给ShowReview()。不同于for_each(),基于范围的for循环可修改容器的内容,诀窍是指定一个引用参数。例如,假原创 2021-03-06 10:31:50 · 148 阅读 · 0 评论 -
STL中的算法(for_each,transform)
for_each函数myPrintInt只能传入一个参数。STL提供的算法来遍历容器(包含算法头文件algorithm)。for_each从容器的起始—>结束逐个元素取出。//myPrintInt容器数据的打印方式ror_ each(v.begin(),v.end() ,myPrintInt) ;cout< <endl ;void myPrintInt(int val){ cout<<val<<" ";}transformtrans原创 2021-03-05 12:16:30 · 101 阅读 · 0 评论 -
c++集合算法
set_ intersection交集算法求两个set集合的交集注意:必须是有序序列beg1:容器1开始迭代器:end1:容器1结束迭代器beg2:容器2开始迭代器end2:容器2结束迭代器dest :目标容器开始迭代器return:容器的最后一个元素的迭代器地址set_intersection(iterator beg1, iterator end1, iterator beg2,iterator end2, iterator dest )例子:vector<int&原创 2021-03-05 17:05:48 · 148 阅读 · 0 评论 -
c++中交换/算术生成算法
swap交换两个容器的内容:swap(container c1, container c2);accumulate计算容器的元素和(求和结束加value):accumulate(iterator begin, iterator end, value);fill往容器中填充值value:v.resize(n);fill(iterator begin, iterator end, value);...原创 2021-03-05 16:31:03 · 66 阅读 · 0 评论 -
c++中拷贝替换算法
copycopy算法将容器内指定范围的元素拷贝到另一容器中@param beg容器开始迭代器@param end容器结束迭代器@param dest目标起始迭代器copy( iterator beg, iterator end, iterator dest );例子:include<iterator>vector<int> v1 ;v1.push_ _back(1) ;v1.push_ back(3) ;v1.push_ back(5) ;v1.pu原创 2021-03-05 16:22:03 · 104 阅读 · 0 评论 -
c++中排序算法
merge容器元素合并,并存储到另一个容器中,某个容器必须有序。merge算法容器元素合并,并存储到另容器中注意:两个容器必须是有序的@param peg1容器1开始迭代器@param end1容器1结束迭代器@param beg2容器2开始迭代器@param end2容器2结束迭代器@param dest目 标容器开始迭代器merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);原创 2021-03-05 16:08:13 · 102 阅读 · 0 评论 -
c++中find算法
常用的查找findfind算法查找元素@param beg容器开始迭代器@param end 容器结束迭代器@param value 查找的元素@return返回查找元素的位置,失败:返回v.end();find( iterator beg, iterator end ,value );例子:vector<int> v1 ;v1. push_back(10) ;vl. push_back(20) ;v1. push_back(30) ;v1.push_back(原创 2021-03-05 15:48:27 · 549 阅读 · 0 评论 -
c++中函数对象
谓词返回值类型为bool的普通函数或仿函数叫谓词。如果普通函数有一个参数,叫一元谓词,有两个参数,叫二元谓词。一元谓词//普通函数作为元谓词bool greaterThan20(int val){ return val>20 ;}//仿函数作为.元谓词class MyGreaterThan20{public: bool operator()(int val) { return val>20; }}for_ each(v. begin() ,v.end(原创 2021-03-05 11:23:53 · 153 阅读 · 1 评论 -
c++面试总结
指针和引用的区别:引用是给变量起别名,内部实现是指针常量(int* constref= &a),其可以简单的理解为本体指针存放的是变量的地址。引用的本质是指针常量,其指向不可修改,而指针可以改变指向。引用创建的同时必须初始化,指针创建的时候可以不必初始化。引用不能为空,指针可以为NULL。“引用变量ref"的内存单元保存的是"被引用变量a"的地址sizeof(引用) =指向变量的大小sizeof(指针)=指针本身的大小。引用使用的时候无需解引用,指针需要解引用。指针和引用"自增/自减原创 2021-03-05 11:00:45 · 197 阅读 · 1 评论 -
c++中适配器
二元适配器”元“指仿函数中的参数个数。val是for_each提供 tmp适配器1: bind2nd 或bind1st绑定参数适配器2:公共继承binary_ function(二元)适配器3:参数的萃取适配器4: 对operator( )进行const修饰class MyPrint:public binary_ function<int, int,void>{public : void operator() (int val,int tmp) const { co原创 2021-03-05 10:49:44 · 170 阅读 · 1 评论 -
c++中map容器
map容器所有元素会根据键值自动排序,每一个元素都是pair(同时拥有键值和实值),pair中:第一个元素被认为是键值,第二个元素被认为是实值。map容器的键值不可变,实值可变。常用的API:第三种:mapStu.insert(map<int,string>::value_type(111,"xxx"));例子:用第四种方法访问map容器时:cout<<m[n]<<endl;,必须保证容器中有该键值,否则会创建一个实值为空的键值。遍历方式:原创 2021-03-04 21:08:07 · 228 阅读 · 1 评论 -
c++中set容器
set容器所有元素会根据元素的键值自动排序。set容器的元素既是键值又是实值。不允许拥有两个相同的键值。不能通过迭代器更改元素,它是只读迭代器。因为会破坏排序规则。可以删除、插入。例子:set查找...原创 2021-03-04 19:29:43 · 1043 阅读 · 1 评论 -
c++中的对组
对组将一对值组成一个值,这一对值可以有不同的数据类型,两个值可以用pair的公有属性:first和second访问。创建对组:应用:原创 2021-03-04 16:56:23 · 526 阅读 · 1 评论 -
c++中的链表list容器
由于list是一个双向链表,所以迭代器必须具备前移、后移的能力,双向迭代器,不支持随机迭代器。随机迭代器和双向迭代器都支持“++”双向迭代器只支持“++”。随机迭代器支持“++”和“+n”插入和删除不会造成原有的list迭代器失效,而vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。基本函数注意:函数sort(v.begin(), v.end());仅支持随机访问迭代器(不支持list)而list有自己的排序函数:sort();例子:删除自定义数据.原创 2021-03-04 11:22:32 · 194 阅读 · 5 评论 -
c++队列容器queue
先进先出,有两个口,没有迭代器,不能遍历,只能访问顶端的元素才能被访问。例子:原创 2021-03-04 08:57:51 · 125 阅读 · 2 评论 -
c++中的stack容器·
栈(stack)是一种先进后出的数据结构,但它不允许有遍历行为,不提供迭代器。只能返回栈顶元素。包含头文件< stack>原创 2021-03-04 08:47:20 · 69 阅读 · 2 评论 -
c++标准模板库STL
STLSTL中几乎所有的代码都采用了类模板和模板函数实现,这相比于传统有更好的代码重用的机会。三大组件:容器(container)、算法(algorithm)、迭代器(iterator)三者关系:算法操作数据,容器存储数据,迭代器是算法操作容器的桥梁。迭代器和容器一一对应。六大组件:容器存放数据。各种数据结构:vector,list,deque,set,map等等,从实现角度看,STL容器是一种类模板。vectorvector<int> v;vector<in原创 2021-03-04 08:32:07 · 91 阅读 · 0 评论 -
c++中deque(双端动态数组)
deque容器双端动态数组。与vector的差异:deque插入和删除为常数项时间,不会因为数据量的大小改变操作所耗时间。deque没有容量的概念。它有分段连续空间组成,由中控器连接。当前空间不足时,另开辟一段空间,并和原来的拼接在一起,像链表。而vector会在新空间开辟后删除原来的旧空间。deque构造函数例子:例子:...原创 2021-03-03 20:29:59 · 269 阅读 · 2 评论 -
c++中vector容器(维克多配98k ^_^)
维克多配98k,天下无敌^_ ^,开个玩笑,下面进入正题:vectorvector是动态空间,随着元素的加入,它会自动扩充空间容纳新元素。单端操作,尾插,尾删。vector容器的迭代器:随机访问迭代器(迭代器+n可以通过编译)。容量(capacity):空间然元素的个数。大小(size):空间实际存放元素的个数。capacity >= size。vector<int> v;v.push_back(数据);//往容器v中存放数据vector<int>.原创 2021-03-03 13:02:34 · 295 阅读 · 0 评论 -
string类
string构造字符串string类将string::npos定义为字符串的最大长度,通常为unsigned int的最大值。另外,表格中使用缩写NBTS(null-terminated string)来表示以空字符结束的字符串——传统的C字符串。string类的构造函数string(const char * s)将string对象初始化为s指向的NBTSstring(size_type n, char c)创建一个包含n个元素的string对象,其中每个元素都被初始化为字符cst原创 2021-03-02 16:15:02 · 91 阅读 · 0 评论