【数据结构】第二站:顺序表
目录
一、线性表
二、顺序表
1.顺序表的概念以及结构
2.顺序表的接口实现
3.顺序表完整代码
三、顺序表的经典题目
1.移除元素
2.删除有序数组中的重复项
3.合并两个有序数组
一、线性表
在了解顺序表前,我们得先了解线性表的概念
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
二、顺序表
1.顺序表的概念以及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改
顺序表一般可以分为静态顺序表和动态顺序表
静态顺序表
typedef int SLDateType;#define N 10typedef struct SeqList {SLDateType a[N];int size; }SL;
如上代码所示,就是静态顺序表的定义。但是静态顺序表很不好用,因为开多了内存浪费,开少了不够用
动态顺序表
//动态顺序表 typedef int SLDateType;typedef struct SeqList {SLDateType* a;//指向数据的指针int size;int capacity; //容量 }SL;
如上代码所示,动态的顺序表就是通过一个指针来指向数据。为了动态管理,所以要添加一个容量的变量
2.顺序表的接口实现
我们使用顺序表的目的就是为了增删查改一些数据。为此接口主要围绕增删查改。
1.顺序表接口声明
//顺序表的初始化 void SeqListInit(SL* ps); //顺序表的销毁 void SeqListDestroy(SL* ps); //顺序表的打印 void SeqListPrint(SL ps); //顺序表的尾插 void SeqListPushBack(SL* ps,SLDateType x); //顺序表的头插 void SeqListPushFront(SL* ps, SLDateType x); //顺序表的尾删 void SeqListPopBack(SL* ps); //顺序表的头删 void SeqListPopFront(SL* ps); //顺序表的查找 int SeqListFind(SL* ps, SLDateType x); //顺序表在pos位置的插入 void SeqListInsert(SL* ps, int pos, SLDateType x); //顺序表在pos位置的删除 void SeqListErase(SL* ps, int pos);
如上代码所示,对于顺序表,我们主要的目的就是增删查改,因此我们所需要实现的接口就又初始化、销毁、打印、尾插、头插、尾删、头删、查找、在某位置插入、在某位置删除等
2.顺序表的初始化
//顺序表的初始化 void SeqListInit(SL* ps) {assert(ps);ps->a = (SLDateType*)malloc(sizeof(SLDateType) * INIT_CAPACITY);if (ps->a == NULL){perror("malloc fail");return;}ps->size = 0;ps->capacity = INIT_CAPACITY; }
如上代码所示,我们的函数参数是顺序表的指针,返回类型是void。
首先肯定ps是不可能为空的,因为ps是顺序表的地址。
然后我们让顺序表的数据指针指向的数组初始容量设置为INIT_CAPACITY,这个容量由宏来自定义。然后判断是否开辟内存成功。
如果成功则将size置为0,size代表的是当前顺序表内已经存放的数据个数。
2.顺序表的销毁
//顺序表的销毁 void SeqListDestroy(SL* ps) {assert(ps);free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0; }
我们在来看一下顺序表的销毁,对于顺序表的销毁,也是比较简单的,我们的顺序表中,数据指针所指向的区域是在堆区的,所以我们要对这个堆区进行释放掉。然后将其置空,最后size和capacity都置为0即可
3.顺序表打印
//顺序表的打印 void SeqListPrint(SL s) {int i = 0;for (i = 0; i < s.size; i++){printf("%d ", s.a[i]);}printf("\n"); }
如上代码所示,由于是打印数据,所以我们传一个形参就已经可以了。当然传顺序表的地址也是没有任何问题的。然后就是使用一个循环来进行打印即可。
4.顺序表的尾插以及扩容函数
//扩容函数 void CheckCapacity(SL* ps) {assert(ps);if (ps->size == ps->capacity){SLDateType* tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * (ps->capacity) * 2);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;} } //顺序表的尾插 void SeqListPushBack(SL* ps,SLDateType x) {assert(ps);CheckCapacity(ps);ps->a[ps->size] = x;ps->size++; }
如上代码所示,我们想要对顺序表进行尾插,那么首先我们得确保一下当前的容量是否足够,为了代码的简洁,我们直接将检查容量封装成一个函数,在检查容量的过程中,如果size和capacity相等,那么就意味着函数需要扩容了。我们使用realloc函数进行扩容即可,需要注意的是,进行扩容的时候要使用一个新的指针进行接收这个扩容后的地址,不然一旦扩容失败,后果得不偿失。我们一般采用的是扩容二倍。当然这里我们可以根据自己的想法进行调整。
扩容成功以后,由于是一个数组,那么就很简单的直接将数组的最后一个元素直接赋值即可,然后size++就可以了
5.顺序表的头插
//顺序表的头插 void SeqListPushFront(SL* ps, SLDateType x) {assert(ps);CheckCapacity(ps);int i = 0;for (i = ps->size - 1; i >= 0; i--){ps->a[i + 1] = ps->a[i];}ps->a[0] = x;ps->size++; }
对于顺序表的头插,我们仍然是先检查容量,这里就体现我们之前将扩容封装成一个一个函数的优势了。然后使用一个循环,将整个数组的值向后移动一个空间。最后将第一个元素给插入x即可
6.顺序表的尾删
//顺序表的尾删 void SeqListPopBack(SL* ps) {assert(ps);if (ps->size == 0){printf("无可删除数据\n");return;}ps->size--; }
对于这个尾删,我们特别需要主要的是当size为0的时候,就没有数据,不需要删除即可,这里可以采用assert暴力截止,也可以使用return温柔的拦截
然后我们直接让size--就可以了
7.顺序表的头删
//顺序表的头删 void SeqListPopFront(SL* ps) {assert(ps);if (ps->size == 0){printf("无可删除数据\n");return;}int i = 0;for (i = 0; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--; }
对于顺序表的头删,也是需要注意size为0的情况,然后将从下标为1的元素开始,全体元素向前移动的一个空间即可,最后size--
8.顺序表的查找
//顺序表的查找 int SeqListFind(SL* ps, SLDateType x) {assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1; }
对于顺序表的查找,我们就直接采用循环遍历的方式即可,如果找到了,则返回下标,否则返回-1
9.顺序表在pos位置的插入
//顺序表在pos位置的插入 void SeqListInsert(SL* ps, int pos, SLDateType x) {assert(ps);assert(pos >= 0 && pos <= ps->size);CheckCapacity(ps);int i = 0;for (i = ps->size - 1; i >= pos; i--){ps->a[i + 1] = ps->a[i];}ps->a[pos] = x;ps->size++; }
如上代码所示,在pos位置的插入,那么首先需要注意的是,pos的范围要合理,pos应该大于等于0且小于等于size,pos等于size其实就是尾插
然后检查容量,使用循环将原来pos以及之后的位置统一向后移动一个空间,然后将pos位置的值赋值即可,最后size++
10.顺序表在pos位置的删除
//顺序表在pos位置的删除 void SeqListErase(SL* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);int i = 0;for (i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--; }
对于在pos位置的删除,那么思路与前面也是极其相似的,首先需要注意的是pos的范围,这里要小心了,pos是不可以等于size的
然后就是通过循环,将pos后面的数据,统一向前覆盖即可
3.顺序表完整代码
SeqList.h
#pragma once //静态顺序表 //typedef int SLDateType; // //#define N 10 // //typedef struct SeqList //{ // SLDateType a[N]; // int size; //}SL; #include<stdio.h> #include<malloc.h> #include<assert.h> #define INIT_CAPACITY 4 //动态顺序表 typedef int SLDateType;typedef struct SeqList {SLDateType* a;//指向数据的指针int size;int capacity; //容量 }SL;//顺序表的初始化 void SeqListInit(SL* ps); //顺序表的销毁 void SeqListDestroy(SL* ps); //顺序表的打印 void SeqListPrint(SL ps); //顺序表的尾插 void SeqListPushBack(SL* ps,SLDateType x); //顺序表的头插 void SeqListPushFront(SL* ps, SLDateType x); //顺序表的尾删 void SeqListPopBack(SL* ps); //顺序表的头删 void SeqListPopFront(SL* ps); //顺序表的查找 int SeqListFind(SL* ps, SLDateType x); //顺序表在pos位置的插入 void SeqListInsert(SL* ps, int pos, SLDateType x); //顺序表在pos位置的删除 void SeqListErase(SL* ps, int pos);
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"SeqList.h"//顺序表的初始化 void SeqListInit(SL* ps) {assert(ps);ps->a = (SLDateType*)malloc(sizeof(SLDateType) * INIT_CAPACITY);if (ps->a == NULL){perror("malloc fail");return;}ps->size = 0;ps->capacity = INIT_CAPACITY; } //顺序表的销毁 void SeqListDestroy(SL* ps) {assert(ps);free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0; } //顺序表的打印 void SeqListPrint(SL s) {int i = 0;for (i = 0; i < s.size; i++){printf("%d ", s.a[i]);}printf("\n"); } //扩容函数 void CheckCapacity(SL* ps) {assert(ps);if (ps->size == ps->capacity){SLDateType* tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * (ps->capacity) * 2);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;} } //顺序表的尾插 void SeqListPushBack(SL* ps,SLDateType x) {assert(ps);CheckCapacity(ps);ps->a[ps->size] = x;ps->size++; } //顺序表的头插 void SeqListPushFront(SL* ps, SLDateType x) {assert(ps);CheckCapacity(ps);int i = 0;for (i = ps->size - 1; i >= 0; i--){ps->a[i + 1] = ps->a[i];}ps->a[0] = x;ps->size++; } //顺序表的尾删 void SeqListPopBack(SL* ps) {assert(ps);if (ps->size == 0){printf("无可删除数据\n");return;}ps->size--; } //顺序表的头删 void SeqListPopFront(SL* ps) {assert(ps);if (ps->size == 0){printf("无可删除数据\n");return;}int i = 0;for (i = 0; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--; } //顺序表的查找 int SeqListFind(SL* ps, SLDateType x) {assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1; } //顺序表在pos位置的插入 void SeqListInsert(SL* ps, int pos, SLDateType x) {assert(ps);assert(pos >= 0 && pos <= ps->size);CheckCapacity(ps);int i = 0;for (i = ps->size - 1; i >= pos; i--){ps->a[i + 1] = ps->a[i];}ps->a[pos] = x;ps->size++; } //顺序表在pos位置的删除 void SeqListErase(SL* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);int i = 0;for (i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--; }
Test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"SeqList.h"void TestSeqList1() {SL s;SeqListInit(&s);SeqListPushBack(&s, 1);SeqListPushBack(&s, 2);SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPrint(s);SeqListPushFront(&s, 4);SeqListPushFront(&s, 3);SeqListPushFront(&s, 2);SeqListPushFront(&s, 1);SeqListPrint(s);SeqListPopBack(&s);SeqListPopBack(&s);SeqListPopBack(&s);SeqListPrint(s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPrint(s);SeqListPopFront(&s);SeqListPrint(s);SeqListPopFront(&s);SeqListPrint(s);SeqListPopFront(&s);SeqListPrint(s);SeqListPopFront(&s);SeqListPrint(s);SeqListPopFront(&s);SeqListPopFront(&s);} void TestSeqList2() {SL s;SeqListInit(&s);SeqListPushBack(&s, 1);SeqListPushBack(&s, 2);SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPrint(s);int pos = SeqListFind(&s, 3);SeqListInsert(&s, pos, 5);SeqListInsert(&s, pos, 6);SeqListInsert(&s, pos, 7);SeqListPrint(s);SeqListErase(&s, pos);SeqListErase(&s, pos);SeqListErase(&s, pos);SeqListPrint(s);} int main() {//TestSeqList1();TestSeqList2();return 0; }
三、顺序表的经典题目
1.移除元素
题目链接:力扣
解一:暴力循环法
即利用顺序表在某个位置的删除,只要某个位置满足删除的条件,就将后面的数据全部移动到前面来。但是效率太低,时间复杂度达到了O(N²)
解二:使用新数组
开辟一个新的数组,如果原数组中的这个元素不是需要移除的元素,则直接拷贝到新数组中,如果是需要移除的元素,则不拷贝,最后将新数组拷贝到原来的数组中即可,如果新数组开辟在了堆区,那么要记得释放空间,这种方法的时间复杂度和空间复杂度均为O(N),显然不满足题目要求
解三:使用双指针
思路与解二基本类似,但是不同的是,我们可以利用两个下标来实现我们的思路,我们设置两个下标src和dst,我们让src去遍历整个数组,如果在src处的值不是val,则将src处的值拷贝到dst中,然后src和dst均++
如果是val,则src++。其余不动,代码如下
int removeElement(int* nums, int numsSize, int val) {int src = 0;int dst = 0;int i = 0;for (i = 0; i < numsSize; i++){if (nums[i] != val){nums[dst] = nums[src];dst++;src++;}else{src++;}}return dst; }
2.删除有序数组中的重复项
题目描述:力扣
对于这道题,我们的思路和第一道题是基本一致的,采用双指针的方法
如上图所示,我们使用src和dst两个下标,src初始值设置为1,dst设置为0,那么当src和dst的值相等的时候,src++。如果不相等,则先让dst++,然后将src处的值赋值给dst,最后src++。代码如下
int removeDuplicates(int* nums, int numsSize) {int src = 1;int dst = 0;for (src = 1; src < numsSize;){if (nums[src] == nums[dst]){src++;}else{dst++;nums[dst] = nums[src];src++;}}return dst + 1; }
3.合并两个有序数组
题目描述:力扣
解一:直接合并,然后排序
最简单的方式就是直接暴力合并,然后采用排序算法就可以了。但是这是一个俗手。时间复杂度较高
解二:归并
对于这道题而言,我们可以采用归并的思路
首先是设置三个下标end1,end2,end。
然后我们循环比较end1和end2所指向的较大值,将较大值赋给end所指向的位置。然后赋值的end和被赋值的end均--。
当end2的值先变成了负数的时候,那么自然是最好的状态,此时肯定有序。
但是当end1的值先变成了负数的时候,那么end2的数据并未完全存放到nums1中,此时我们需要将end2的剩余元素给插入到nums1中
具体代码如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int end1 = m - 1;int end2 = n - 1;int end = m + n - 1;while (end1 >= 0 && end2 >= 0){if (nums1[end1] > nums2[end2]){nums1[end] = nums1[end1];end--;end1--;}else{nums1[end] = nums2[end2];end--;end2--;}}if (end1 < 0){while (end2 >= 0){nums1[end] = nums2[end2];end2--;end--;}} }
好了,本期内容就到这里
如果对你有帮助的话,不要忘记点赞加收藏哦!!!
相关文章:
【数据结构】第二站:顺序表
目录 一、线性表 二、顺序表 1.顺序表的概念以及结构 2.顺序表的接口实现 3.顺序表完整代码 三、顺序表的经典题目 1.移除元素 2.删除有序数组中的重复项 3.合并两个有序数组 一、线性表 在了解顺序表前,我们得先了解线性表的概念 线性表(linear…...
嵌入式安防监控项目——实现真实数据的上传
目录 一、相关驱动开发 二、A9主框架 三、脚本及数据上传实验 https://www.yuque.com/uh1h8r/dqrma0/tx0fq08mw1ar1sor?singleDoc# 《常见问题》 上个笔记的相关问题 一、相关驱动开发 /* mpu6050六轴传感器 */ i2c138B0000 { /* #address-cells <1>…...
SAP 生成UUID
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。 UUID-Universally…...
DevOPs介绍,这一篇就足够了
一、什么是DevOps? DevOps是一种将软件开发和IT运维进行整合的文化和运动。它的目标是通过加强软件开发、测试和运维之间的协作和沟通,使整个软件开发和交付过程更加高效、快速、安全和可靠。DevOps涵盖了从计划和设计到开发、测试、交付和部署的全生命…...
libcurl库简介
一、libcurl简介libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。…...
Spark SQL支持DataFrame操作的数据源
DataFrame提供统一接口加载和保存数据源中的数据,包括:结构化数据、Parquet文件、JSON文件、Hive表,以及通过JDBC连接外部数据源。一个DataFrame可以作为普通的RDD操作,也可以通过(registerTempTable)注册成…...
Java【归并排序】算法, 大白话式图文解析(附代码)
文章目录前言一、排序相关概念1, 什么是排序2, 什么是排序的稳定性3, 七大排序分类二、归并排序1, 图文解析2, 代码实现三、性能分析四、七大排序算法总体分析前言 各位读者好, 我是小陈, 这是我的个人主页 小陈还在持续努力学习编程, 努力通过博客输出所学知识 如果本篇对你有…...
【springboot】数据库访问
1、SQL 1、数据源的自动配置-HikariDataSource 1、导入JDBC场景 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>数据库驱动? 为什么导入JD…...
普通和hive兼容模式下sql的差异
–odps sql –– –author:宋文理 –create time:2023-03-08 15:23:52 –– – 差异分为三块 – 1.运算符的差异 – 2.类型转换的差异 – 3.内建函数的差异 – 以下是运算符的差异: – BITAND(&) – 当输入参数是BIGINT类型的时候&…...
github开源自己代码
接下来,我们需要先下载Git,的网址:https://git-scm.com/downloads,安装时如果没有特殊需求,一直下一步就可以了,安装完成之后,双击打开Git Bash 出现以下界面: 第一步:…...
数据库基础语法
sql(Structured Query Language 结构化查询语言) SQL语法 use DataTableName; 命令用于选择数据库。set names utf8; 命令用于设置使用的字符集。SELECT * FROM Websites; 读取数据表的信息。上面的表包含五条记录(每一条对应一个网站信息&…...
【Java】期末复习知识点总结(4)
适合Java期末的复习~ (Java期末复习知识点总结分为4篇,这里是最后一篇啦)第一篇~https://blog.csdn.net/qq_53869058/article/details/129417537?spm1001.2014.3001.5501第二篇~https://blog.csdn.net/qq_53869058/article/details/1294751…...
IDEA好用插件:MybatisX快速生成接口实体类mapper.xml映射文件
目录 1、在Idea中找到下载插件,Install,重启Idea 2、一个测试java文件,里面有com包 3、在Idea中添加数据库 --------以Oracle数据库为例 4、快速生成entity-service-mapper方法 5、查看生成的代码 6、自动生成(增删查改࿰…...
【JavaEE】初识线程
一、简述进程认识线程之前我们应该去学习一下“进程" 的概念,我们可以把一个运行起来的程序称之为进程,进程的调度,进程的管理是由我们的操作系统来管理的,创建一个进程,操作系统会为每一个进程创建一个 PCB&…...
智慧水务监控系统-智慧水务信息化平台建设
平台概述柳林智慧水务监控系统(智慧水务信息化平台)是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心,以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧运维等产品体系为…...
【Linux】进程优先级前后台理解
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹相关文章推荐:【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习(Ⅰ)浅谈Linux下的shell--BASH【Linux…...
时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元)
时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元) 目录 时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元)效果一览基本描述模型描述程序设计参考资料效果一览...
python 模拟鼠标,键盘点击
信息爆炸 消息轰炸模拟鼠标和键盘敲击import time from pynput.keyboard import Controller as key_col from pynput.mouse import Button,Controller def keyboard_input(insertword):keyboardkey_col()keyboard.type(insertword)def mouth():mouseController()mouse.press(…...
【CSS】盒子边框 ③ ( 设置表格细线边框 | 合并相邻边框 border-collapse: collapse; )
文章目录一、设置表格细线边框1、表格示例2、合并相邻边框3、完整代码示例一、设置表格细线边框 1、表格示例 给定一个 HTML 结构中的表格 , 默认样式如下 : <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" />…...
TensorRT量化工具pytorch_quantization代码解析(一)
量化工具箱pytorch_quantization 通过提供一个方便的 PyTorch 库来补充 TensorRT ,该库有助于生成可优化的 QAT 模型。该工具包提供了一个 API 来自动或手动为 QAT 或 PTQ 准备模型。 API 的核心是 TensorQuantizer 模块,它可以量化、伪量化或收集张量的…...
【Kubernetes】第二十七篇 - 布署前端项(下)
一,前言 上一篇,介绍了前端项目的部署:项目的创建和 jenkins 配置; 本篇,创建 Deployment、Service,完成前端项目的部署; 二,创建 Deployment 创建 Deployment 配置文件ÿ…...
【MFC】两个ListBox控件数据交互
一.控件ID名称 界面如图下所示: 候选数据列表的ID为: 已选数据列表的ID为: 二.数据添加 可以使用以下代码往框中添加数据: ((CListBox *)GetDlgItem(IDC_LIST_TO_CHO))->AddString("测试数据"); 显示效果如下&#…...
sklearn库学习--SelectKBest 、f_regression
目录 一、SelectKBest 介绍、代码使用 介绍: 代码使用: 二、评分函数 【1】f_regression: (1)介绍: (2)F值和相关系数 【2】除了f_regression函数,还有一些适用于…...
蓝桥杯刷题第十三天
第一题:特殊日期问题描述对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 11 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数…...
CPU 和带宽之间的时空权衡
在 从一道面试题看 TCP 的吞吐极限 一文的开始,我提到在环形域上两个数字比较大小的前提是在同一个半圆内,进而得到滑动窗口最大值被限定在一个环形域的一半。 现在来看更为基本的问题。如果序列号只有 2bit,甚至仅有 1bit,保序传…...
ES+Redis+MySQL,这个高可用架构设计太顶了!
一、背景 会员系统是一种基础系统,跟公司所有业务线的下单主流程密切相关。如果会员系统出故障,会导致用户无法下单,影响范围是全公司所有业务线。所以,会员系统必须保证高性能、高可用,提供稳定、高效的基础服务。 …...
【Maven】Maven的常用命令
目录 一、Maven的常用命令 1、compile 编译命令 2、test 测试命令 3 、clean 清理命令 4、package 打包命令 5、 install 安装命令 6、Maven 指令的生命周期 二、maven 的概念模型 💟 创作不易,不妨点赞💚评论❤️收藏💙一…...
python的循环结构
python中有for循环和while循环两种形式。 1. for 循环 可以用for循环来遍历不同类型的对象,如数组、列表、元组、字典、集合或字符串,并对每个元素执行一段代码。 1.1 数组的for循环 用for循环遍历一个数组,并打印出每个元素:…...
五种Python中字典的高级用法
1. 引言 Python中的字典是一种非常有用的数据结构,它允许大家存储键值对。通常来说,字典灵活、高效且易于使用,是Python中最常用的数据结构之一。字典通常被用于统计频率、映射值等任务,但在Python中使用字典也可以达到许多意想不…...
[蓝桥杯单片机]——八到十一届初赛决赛客观题
第八届初赛 一、填空题 采用外部12MHz晶振,经过系统12分频时定时器获得最大定时长度,此时定时器定时脉冲为1MHz,周期为1s,而定时器计时均为16位加法计数器,即计时长度为。 二、 选择题 ①带阻滤波器是指能通过大多数频…...
巴城镇建设网站/谷歌搜索引擎下载安装
小小喜欢看的动画片我也跟着看起来,发现了一个事实。 小小看的动画片都是国外的,比如《爱探险的朵拉》,《米奇妙妙屋》...但是大致宗旨只有两个,值得我们成年人学习: 1.所有的事情快要成功的时候,总是有个“…...
中关村网站建设公司/网络优化培训
这里的电压环带宽,反应的是电压环响应指令能力。即输出电压跟踪指令电压的能力。 指令响应能力需要有一个指标来衡量,例如用输入阶跃指令来看输出的上升、超调等 或者用输入正弦指令看输出正弦分量与指令的幅度差和相位差,这就是我们说的带…...
星海湾建设管理中心网站/沈阳seo关键词排名
ApplicationInspector是一款功能强大的软件源代码分析与审计工具,它可以帮助研究人员识别和发现目标应用程序中的公众周知的功能以及源代码中有意思的特性,并清楚目标应用的本质特征以及实现的功能。 ApplicationInspector跟传统静态分析工具不同的是&a…...
做网站能做职业吗/seo博客教程
f5 刷新页面 page——load事件,用if(!IsPostBack)也可以避免F5 刷新...
免费学做淘宝的网站/网络平台运营是做什么的
java中public与private还有protect的区别 总是忘记。...
建设工程施工包括哪些工程/广州seo优化公司
在golang的开发过程中,当我们使用orm的时候,常常需要将数据库表对应到golang的一个struct,这些struct会携带orm对应的tag,就像下面的struct定义一样:gotype InsInfo struct {Connections string gorm:"column:connections&qu…...