IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法基础篇(一) -> 正文阅读

[数据结构与算法]数据结构与算法基础篇(一)

内容

1.链表与邻接表
2.栈与队列
3.kmp
要非常快得 把代码默写出来 一个模板要好好儿理解于熟练
《记忆力和自制力》

一、链表

数组模拟构造 静态链表

1.单链表

#include<iostream>
//算法 不是工程  所以就可以不怕内存泄露
using namespace std;
//head  头节点的下标
//e[]值  ne[]  结点i的next指针   即i.next
//idx当前待插入的位置,即当前已经用到哪个点了
const int N = 100010;
int head,e[N],ne[N],idx;
//初始化  用-1  表示空  所以尾结点也是-1
void init(){
    head = -1;
    idx = 0;
}
//从头结点 插入指针
void head_add(int x){
    e[idx] = x; //当前位置赋值;
    ne[idx] = head;//当前位置的下一个结点 应该指向  之前头指针所指
    head = idx;
    idx++;
}
//在第k个位置后面 插入x
void add(int k,int x){
    e[idx] = x,ne[idx] = ne[k],ne[k] = idx,idx++;
}
//删除k后面的点
void remove(int k){
    ne[k] = ne[ne[k]];
}
int main(){
	//主函数里写的
	return 0;
}

//链表的遍历办法!!!
for(int i = head;i != -1;i = ne[i]){
cout<<e[i]<<" ";
}

2.双链表

常用来做某些问题的优化

int m;
const int N = 100010;

int  e[N],l[N],r[N],idx;
//初始化
void init(){
    //0 是左端点   1是右端点
    r[0] = 1;  //0号点的左边  是1号点
    l[1] = 0;
    idx  = 2;
}
//在第k个插入的数后面右侧插入一个数
//在第k个点的左边插入  就是在l[k]的右边插入;
void add(int k,int x){
    e[idx] = x;
    r[idx] = r[k];
    l[idx] = k;
    l[r[k]] = idx;
    r[k] = idx;
}
//删除第k个数
//左边的右边 直接等于右边
//右边的左边  直接等于左边
void remove(int k){
    r[l[k]] = r[k];
    l[r[k]] = l[k];
}

3.邻接表

就是n个 单链表
常,用来解决数和图的问题的。

二、栈和队列

1.栈

栈的操作要求
在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 100010;
int stk[N],tt;
//插入
stk[++t]=x;
//删除
t--;
//判空
if(tt>0)  notempty;
else empty
//栈顶元素
stk[tt];

2.队列

如图:
在这里插入图片描述

//队尾插入元素   队头弹出元素  tt是队尾
int q[N],hh = 0,tt=-1;
//插入
q[++t] = x;
//弹出
hh++;
//判空
if(hh<=tt)  notempty;
else empty;
//取元素
q[hh];

单调栈和单调队列
(抽象但一共也没有几种题型)
用于优化
在这里插入图片描述

3.单调栈

在这里插入图片描述

//有逆序的关系  前面的数就删掉了
#include <iostream>
using namespace std;
const int N =100010;
int stk[N],tt;
//tt栈顶指针
int main(){
    //ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i = 0; i < n;i++){
        int x;
        scanf("%d",&x);
        while(tt&&stk[tt]>=x) tt--;
        //栈里面的元素大于当前元素  栈顶元素就没希望了
        //如果 是找左边比他大的第一个数  那么栈顶元素比当前元素小 则没希望
        if(tt) printf("%d ",stk[tt]);
        else printf("-1 ");
        
        stk[++tt] = x;
    }
    return 0;
}

变单调 再求极值 求极值的时间就是O(1)了

4. 单调队列

(题目:滑动窗口)
在这里插入图片描述
思路:
当求最小时,当i>j且a[i]>a[j],a[i]一定不作为答案出现,于是我们可以得到一个上升序列

#include<iostream>
using namespace std;
const int N =1000010;
//入队和出队
//因为是  在两边操作
//用队列  来存储下标
//多重背包 也可以用单调队列优化
int n,k;
int a[N],q[N];
int main(){
    scanf("%d%d",&n,&k);
    int hh = 0,tt = -1;
    for(int i = 0; i < n; i++) scanf("%d",&a[i]);
    //求最小值
    for(int i = 0; i < n;i++){
        if(hh<=tt&&q[hh] <= i-k)  hh++;
        while(hh<=tt&&a[q[tt]]>=a[i]) tt--;  //循环的条件不为空 且有比当前大的数
        //要注意!  必须要在有第k个的时候 才能输出
        q[++tt] = i;
        if(i >= k - 1)  printf("%d ",a[q[hh]]);
        
    }
    puts("");
    //求最大值
    hh = 0, tt = -1;    //一定要清空  队列
    for(int i = 0; i < n; i++){
         if(hh<= tt && q[hh] <= i-k) hh++;
         while(hh <= tt && a[q[tt]] <= a[i]) tt--;
         q[++tt] = i;
         if(i >= k-1) printf("%d ",a[q[hh]]); 
     }
    return 0;
}

总结:
共同思路都是,首先用模拟栈和队列暴力的做法做出来,然后观察有哪些元素是不需要的,删掉不需要的元素得到单调的序列,(挖掘一些性质、可以把目光集中到比较少的状态里面,从而减少复杂度)。
即:单调 再找极值

三、KMP

KMP算法是一种改进的字符串匹配算法
KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!

KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。

题解1

题解2

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-21 12:38:31  更:2021-10-21 12:41:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/1 14:38:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码