当前位置: 首页 > news >正文

《不一样的数据结构之—顺序表》

《不一样的数据结构之—顺序表》

文章目录

  • 《不一样的数据结构之—顺序表》
  • 前言
  • 一、顺序表的概念
    • 1.1 线性表的定义
    • 1.2 线性表的顺序存储-顺序表
  • 二、顺序表的模拟实现
    • 2.1创建
    • 2.2添加⼀个元素
      • 2.2.1尾插
      • 2.2.2头插
      • 2.2.3任意位置插入
    • 2.3删除⼀个元素
      • 2.3.1尾删
      • 2.3.2头删
      • 2.3.3任意位置删
    • 2.4查找元素
      • 2.4.1按值查找
      • 2.4.2按位置查找
  • 2.5 修改元素
  • 2.6 清空顺序表
  • 2.7所有测试代码
  • 总结


前言

本系列讲解算法竞赛的数据结构在算法竞赛中,我们主要关⼼的其实是时间开销,空间上是基本够用的,因此我们是使用庞大的数组实现的话不多说冲!
在这里插入图片描述

一、顺序表的概念

1.1 线性表的定义

线性表是n 个具有相同特性的数据元素的有序序列。
线性表在逻辑上可以想象成是连续的⼀条线段,线段上有很多个点,⽐如下图:
在这里插入图片描述
故线性表是⼀个比较简单和基础的数据结构

1.2 线性表的顺序存储-顺序表

线性表的顺序存储就是顺序表。
如果下图中的方格代表内存中的存储单元,那么存储顺序表中 这个元素就是放在连续的位置上:
在这里插入图片描述
⼤家会发现,这不就是⽤⼀个数组把这些元素存储起来了嘛?是的,顺序表就是通过数组来实现的

二、顺序表的模拟实现

PS:往后实现各种数据结构的时候,如果不做特殊说明,默认里面存储的就是int类型的数据。

2.1创建

//创建
const int N = 1e5 + 10;  // 定义静态数组的最⼤⻓度 
int a[N],n;  // 直接创建⼀个⼤数组来实现顺序表, n 表⽰当前有多少个元素   

2.2添加⼀个元素

2.2.1尾插

//尾插
void puch_back(int x)
{a[++n] = x;   // 下标为 0 的位置空出来 // 这样操作⼀般根据个⼈习惯,也可以从 0 开始计数 // 不过有些问题从 1 计数,处理起来可以不⽤考虑边界情况 // 后续学习更深的算法的时候,就会感受到 
}

时间复杂度:
直接放在后⾯即可,时间复杂度为O(1)

2.2.2头插

//头插
void puch_front(int x)
{// 要把所有的元素全部右移⼀位,然后再放到头部位置 for (int i = n; i >= 1; i--){a[i + 1] = a[i];}a[1] = x;// 把 x 放在⾸位 n++; //不要忘记总个数 +1 
}

时间复杂度:
由于需要将所有元素右移⼀位,时间复杂度为O(N) 。

2.2.3任意位置插入

// 任意位置插⼊ - 在位置 p 处,插⼊⼀个 x 
void  insert(int x, int p)
{for (int i = n; i >= p; i--)  // 注意顺序不要颠倒 {a[i + 1] = a[i];}a[p] = x;n++;   //// 不要忘记总个数 +1 
}

时间复杂度:
最坏情况下需要数组中所有元素右移,时间复杂度为O(N) 。

2.3删除⼀个元素

2.3.1尾删

//尾删
void pop_back()
{n--;
}

时间复杂度:
显然是O(1) 。

2.3.2头删

//头删
void pop_front()
{// 把所有元素向前移动⼀位 for (int i = 2; i <= n; i++){a[i - 1] = a[i];}n--;   // 总个数 -1 
}

时间复杂度:
需要所有元素整体左移,时间复杂度为O(N) 。

2.3.3任意位置删

//任意位置删
void erase(int p)
{//把所有元素向前移动⼀位for (int i = p + 1; i <= n; i++){a[i - 1] = a[i];}n--;   // 总个数 -1 
}

时间复杂度:
最坏情况下,所有元素都需要左移,时间复杂度为O(N) 。

2.4查找元素

2.4.1按值查找

// 查找这个数第⼀次出现的位置,找不到返回 0 
int find(int x)
{for (int i = 1; i <= n; i++){if (a[i] == x)return i;}return 0;
}

时间复杂度:
最坏情况下需要遍历整个数组,时间复杂度为O(N) 。

2.4.2按位置查找

// 返回 p 位置的数
int at(int p)
{return a[p];
}

时间复杂度:
这就是顺序表随机存取的特性,只要给我⼀个下标,就能快速访问到该元素。
时间复杂度为O(1) 。

2.5 修改元素

// 把 p 位置的数修改成 x 
void change(int p, int x)
{a[p] = x;
}

时间复杂度:
这就是顺序表随机存取的特性,只要给我⼀个下标,就能快速访问到该元素。时间复杂度为O(1) 。

2.6 清空顺序表

// 清空顺序表 
void clear()
{n = 0;
}

时间复杂度:
要注意,我们⾃⼰实现的简单形式是O(1) 。
但是,严谨的⽅式应该是O(N) 。

2.7所有测试代码

#include <iostream>
using namespace std;//创建
const int N = 1e5 + 10;  // 定义静态数组的最⼤⻓度 
int a[N],n;  // 直接创建⼀个⼤数组来实现顺序表, n 表⽰当前有多少个元素    //打印
void print()
{for (int i = 1; i <= n; i++)cout << a[i] << " ";cout << endl;
}//尾插
void push_back(int x)
{a[++n] = x;   // 下标为 0 的位置空出来 // 这样操作⼀般根据个⼈习惯,也可以从 0 开始计数 // 不过有些问题从 1 计数,处理起来可以不⽤考虑边界情况 // 后续学习更深的算法的时候,就会感受到 }//头插
void push_front(int x)
{// 要把所有的元素全部右移⼀位,然后再放到头部位置 for (int i = n; i >= 1; i--){a[i + 1] = a[i];}a[1] = x;// 把 x 放在⾸位 n++; //不要忘记总个数 +1 
}// 任意位置插⼊ - 在位置 p 处,插⼊⼀个 x 
void  insert(int x, int p)
{for (int i = n; i >= p; i--)  // 注意顺序不要颠倒 {a[i + 1] = a[i];}a[p] = x;n++;   //// 不要忘记总个数 +1 
}//尾删
void pop_back()
{n--;
}//头删
void pop_front()
{// 把所有元素向前移动⼀位 for (int i = 2; i <= n; i++){a[i - 1] = a[i];}n--;   // 总个数 -1 
}//任意位置删
void erase(int p)
{//把所有元素向前移动⼀位for (int i = p + 1; i <= n; i++){a[i - 1] = a[i];}n--;   // 总个数 -1 
}// 查找这个数第⼀次出现的位置,找不到返回 0 
int find(int x)
{for (int i = 1; i <= n; i++){if (a[i] == x)return i;}return 0;
}// 返回 p 位置的数
int at(int p)
{return a[p];
}// 把 p 位置的数修改成 x 
void change(int p, int x)
{a[p] = x;
}// 清空顺序表 
void clear()
{n = 0;
}int main()
{// 测试尾插 push_back(2);print();push_back(5);print();push_back(1);print();push_back(3);print();// 测试头插 push_front(10);print();// 测试任意位置插⼊ insert(3, 0);print();//测试尾删 cout << "尾删:" << endl; pop_back();print();pop_back();print();pop_front();pop_front();print();//测试任意位置删除 cout << "任意位置删除:" << endl; erase(3);print();erase(2);print();erase(4);print();for (int i = 1; i <= 10; i++){cout << "查找" << i << ": ";cout << find(i) << endl;return 0;
}

总结

希望大家多多支持,我们下期再见!

在这里插入图片描述

http://www.dtcms.com/a/449092.html

相关文章:

  • [论文阅读] AI+软件工程(DeBug)| 从11%到53%!双LLM驱动的工业级代码修复方案,Google数据集验证有效
  • 机器视觉的工业镜头有哪些?能做什么?
  • 百度免费建立网站dw网页制作教程div
  • 【Linux实战 】Linux 线程池的设计、实现与单例模式应用
  • flask-sqlalchemy中的flush()
  • 娱乐建设网站中国航天科工集团有限公司
  • 分布式系统相关概念(单体、集群、分布式、分布式集群、微服务)
  • vscode 配置使用pyqt5
  • CSS选择器常见用法
  • 【Docker】Windows Docker 完全入门指南:从安装到实战的全流程记录
  • 从零开始的C++学习生活 4:类和对象(下)
  • 温州做网站优化网站设计培训
  • 18网站推广关于旅行的网站怎样做
  • 做网站赚钱还是企业宣传片推广方案万能模板
  • 视频分享网站怎么做的注册营业执照需要什么资料
  • 网站建设教程赚找湖南岚鸿认 可php无版权企业网站管理系统
  • 建立网站站点的目的一个主机可以做几个网站域名
  • 封面上的网站怎么做网站模块设计软件
  • 网站制作还花钱电子商务网站建设及推广方案论文
  • 淮南服装网站建设地址如何做虚拟币交易网站
  • 网站建设规划表乐清网站建设lonwap
  • 网站开发创业计划书模板网上能免费做网站发布叼
  • 湖南张家界建设局网站深圳本地招聘网站有哪些
  • 分析网站建设前期的seo准备工作广东网络文明大会开幕
  • 贵州城乡和住房建设厅网站天津seo方案
  • 青岛php网站建设wordpress可以做博客么
  • 智能建站技术自己注册了个域名想做一个网站
  • 做网页游戏网站需要什么做的网站必须放
  • 乐清网站网络公司wordpress 登陆不了
  • 淘宝作图在哪个网站上做图最专业网站建设开发