数据结构与算法
详细数据结构笔记
0-1背包
主要分享本人的C/C++、python、数据结构等学习笔记,希望跟大家一起学习,一起进步。在专栏中查看更加方便。
展开
-
list、简单的迭代器
头文件 #pragma once #ifndef LIST_H #define LIST_H //防止头文件重复引入 #include<initializer_list> namespace liujin { template<class T> void Swap(T& x, T& y) { T tmp = x; x = y; y = tmp; } template<class _Ty> class list { private原创 2022-02-21 17:15:52 · 570 阅读 · 0 评论 -
5、用C++实现双链表
头文件 #include<iostream> using namespace std; class Node { private: int _val; Node* _next; Node* _pre; public: Node(int val = int()) :_val(val),_next(nullptr),_pre(nullptr)//初始化列表 { } Node(const Node& src)//拷贝构造 :_val(src._val),_next(nul原创 2021-12-12 11:57:31 · 713 阅读 · 0 评论 -
10、算法
八大排序: 1、冒泡排序(沉尸排序) **思想:**每次找到一个最大值放在最后面,每次找到一个最大值向后放(升序),两两比较,如果左边大于右边就交换他们的的值,每次比较结束后会得到最大值。降序就反过来。 **时间复杂度:**O(n^2) **空间复杂度:**O(1) **优点:**实现简单,稳定,不存在跳跃交换 **缺点:**时间复杂度大 #include<stdio.h> #include<assert.h> int * Bubble_sort(int* arr, int arrS原创 2021-11-04 20:56:45 · 85 阅读 · 0 评论 -
7、串(strcpy strcat strcmp strlen)字符串查找 (BF KMP)
1、BF算法(暴力算法)(Brute Force): 字符串匹配问题: 主串:“ababcabcdabcdeb” 子串:“abcd” 子串个数:(1+n)*n/2+1 真子串个数:(1+n)*n/2 目的:在主串中找到子串第一次开始出现的位置。 **BF算法难点:**容易出错(i没有回退) 1、两两比较,如果相等,i++,j++,接着向后比 2、如果匹配到一半发现不相等了,就返回到主串中这趟比较的下一个位置,i=i-j+1, j回退到0 3、如果主串中的i走出了位置,那么并不能判断是否找到了子串相匹配 4、原创 2021-10-28 11:54:04 · 138 阅读 · 0 评论 -
哈希(hash)
1、哈希 Hash(散列): 哈希函数等于散列函数,哈希是一种存储方法,还是一种排序方法,只要算法中用到哈希思想,就可以叫hash算法。 将数据自身的值和最终的存储位置形成一个特定关系 这个关系叫做hash函数:ex:y(存储位置)=f(x(关键值key)) 顺序表:节点之间,物理相邻,逻辑也相邻 链表:节点之间,物理可能不相邻,逻辑相邻 哈希表:节点之间,节点地址与被存储数据之间存在逻辑关系。 2、如何构造哈希(6种) 3、如何解决哈希冲突(主要是连地址法) 1、开放地址法 2、再散列函数法 3、链地原创 2021-10-21 12:44:27 · 693 阅读 · 0 评论 -
队列之链式队列
1、难点 要想用链表实现队列,就必须队尾进,队头出,先进先出,后进后出,这些利用链表的头尾节点都可以实现,即:头删(出队)和尾插(入队),那么如何保证入队和出队的**时间复杂度都为O(1)**呢?显然,头删的时间复杂度已经为O(1),因此要让尾插的复杂度为O(1)的话需要将尾节点保存起来。 2、结构体设计 因此需要进行改进,改进之后的结构体设计如下: //有效节点 typedef struct LQueue { ELEM_TYPE data;//用来保存节点数据 LQueue* next;//用来保原创 2021-10-13 22:14:33 · 177 阅读 · 0 评论 -
队列Queue
1、队列的定义 队列:(Queue)先进先出,后进后出,一端进行插入另一端进行删除。 2、结构体设计原创 2021-10-13 21:30:13 · 101 阅读 · 0 评论 -
栈之链式栈
1、链式栈: 对于链表来说,若每次在最后一个节点进行操作时,时间复杂度为O(n),但是在头节点后面进行操作时间复杂度仅为O(1),因此可以得出链式栈的基本结构。原创 2021-10-11 23:18:19 · 85 阅读 · 0 评论 -
栈之顺序栈
1、栈:stack 2、结构体设计 typedef int ELEM_TYPE; typedef struct Stack { ELEM_TYPE* base;//用于接受malloc来的数组地址 int top;//保存栈顶元素的下标,也是有效元素的个数 int Stacksize;//用来保存栈的最大长度 }Stack,*PStack; 3、头文件 #pragma once typedef int ELEM_TYPE; typedef struct Stack { ELEM_TYPE* ba原创 2021-10-11 17:10:29 · 62 阅读 · 0 评论 -
单循环链表(带头节点实现)
单循环链表 单循环链表:最后一个有效节点的next域指向头节点,当链表内有效节点数为0时,头节点的next域指向头节点本身。 结构体设计: typedef int ELEMTYPE; typedef struct CNode { ELEMTYPE data; struct CNode* next;//保存下一个结点的地址 }CNode,*PNode; 单循环 1、当链表内有效节点数量为0时 ...原创 2021-10-03 21:52:52 · 1178 阅读 · 0 评论 -
顺序表(定长的、扩容)
1、定长线性表 相当于权限更多的数组,存在唯一的头(第一个节点),唯一的尾(最后一个节点),除了第一个有效节点,其余的节点都唯一有前驱节点,除了最后一个有效节点,其余的节点都有唯一后继节点。 //sqlist sequence list // 结构体的定义 函数的声明 #pragma once//保证程序制备编译器编译一次 //定长的顺序表结构体定义 typedef struct Sqlist { int arr[10];//数据域 int length;//有效数据节点的个数 }S原创 2021-09-15 21:32:27 · 205 阅读 · 0 评论