线性表查找顺序查找算法介绍顺序查找算法又称顺序搜索算法或者线性搜索算法,是所有查找算法中最基本、最简单的,对应的时间复杂度为O(n)。
顺序查找算法适用于绝大多数场景,既可以在有序序列中查找目标元素,也可以在无序序列中查找目标元素。
顺序查找的特点:
方法简单
对表的结构无要求
查找效率低,当n较大时不宜采用
算法实现实现思路:所谓顺序查找,指的是从待查找序列中的第一个元素开始,查看各个元素是否为要找的目标元素。若相同则查找成功返回对应数组下标;若遍历完整个数组也没有找到待查找元素,则说明查找失败,返回-1。
1234567891011121314一个简单的顺序查找,其实就是一个for循环 int search(int arr[N],int value){ for(int i=0;i<N;i++) { if(arr[i]==value) return i; } //匹配失败,返回-1 return -1;}
效率分析时间复杂度:
最坏情况:若相同则查找成功返回对 ...
基础篇SQL通用语法
SQL语句可以单行或多行书写,使用回车可换行继续书写最后以分号结尾。
SQL语句可以使用空格/缩进来增加语句的可读性。
MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
注释:
单行注释:– 注释内容 或 # 注释内容(MySQL特有)
多行注释:/*注释内容*/
SQL分类1234DDL: 数据定义语言,用来定义数据库对象(数据库,表,字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据库的用户、控制数据库的访问权限
SQL数据类型见这篇blog->MySQL字段类型最全解析_kun_行者的博客-CSDN博客
SQL运算符SQL学习之运算符_sql运算符有哪些_heart-szu的博客-CSDN博客
SQL七大约束约束条件用法参考这篇blog【MySQL基础】MySQL表的七大约束_mysql 表级约束_小杨MiManchi的博客-CSDN博客
DDL(数据库操作和表操作)数据库操作查询查看所有数据库:
1SHOW ...
MySQL安装MySQL :: MySQL Downloads
MySQL启动与停止启动:
1net start mysql80
停止:
1net stop mysql80
MySQL的客户端连接**方法一:**通过直接提供的MySQL 8.0 Command Line Client输入密码连接
**方法二:**系统的cmd连接
1234mysql [-h 127.0.0.1] [-p 3306] -u root -p可选项1:指定连接ip,不填默认本机可选项2:指定端口号,不填默认3306
注意:要想在任意目录使用这种方式执行mysql指令就必须配置系统环境变量
系统环境变量path中添加:C:\Program Files\MySQL\MySQL Server 8.0\bin(mysql的路径)
基础篇github术语Repository:简称Repo,可以理解为“仓库”,我们的项目就存放在仓库之中。也就是说,如果我们想要建立项目,就得先建立仓库;有多个项目,就建立多个仓库。
Issues:可以理解为“问题”,举一个简单的例子,如果我们开源一个项目,如果别人看了我们的项目,并且发现了bug,或者感觉那个地方有待改进,他就可以给我们提出Issue,等我们把Issues解决之后,就可以把这些Issues关闭;反之,我们也可以给他人提出Issue。
Star:可以理解为“点赞”,当我们感觉某一个项目做的比较好之后,就可以为这个项目点赞,而且我们点赞过的项目,都会保存到我们的Star之中,方便我们随时查看。在 GitHub 之中,如果一个项目的点星数能够超百,那么说明这个项目已经很不错了。
Fork:可以理解为“拉分支”,如果我们对某一个项目比较感兴趣,并且想在此基础之上开发新的功能,这时我们就可以Fork这个项目,这表示复制一个完成相同的项目到我们的 GitHub 账号之中,而且独立于原项目。之后,我们就可以在自己复制的项目中进行开发了。
Pull Request:可以理解为“提交请 ...
1.单线程/进程在TCP通信过程中,服务器端启动之后可以同时和多个客户端建立连接,并进行网络通信,但是在介绍TCP通信流程的时候,提供的服务器代码却不能完成这样的需求,先简单的看一下之前的服务器代码的处理思路,再来分析代码中的弊端:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <arpa/inet.h>int main(){ // 1. 创建监听的套接字 int lfd = socket(AF_INET, SOCK_STREAM, 0); // 2. 将socket()返回值和本地的IP端口绑定到一起 struct sockaddr_in addr; addr.sin_fa ...
1.任务队列类声明(Task,TaskQueue)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455//// Created by keqiu on 2023/7/18.//#ifndef C___PRACTICE_TASKQUEUE_H#define C___PRACTICE_TASKQUEUE_H#include <queue>#include <pthread.h>using function = void(*)(void* arg);//为一个函数指针类型取别名struct Task{ Task(){ working = nullptr; arg = nullptr; } /*无参构造*/ Task(function working, void* arg){ this->working = wo ...
1.线程池原理我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。
那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢?
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件), 则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
在各个编程语言的语种中都有线程池的概念,并且很多语言中直接提供了线程池,作为程序猿直接使用就可以了,下面给大家介绍一下线程池的实现原理:
线程池的组成主要分为 3 个部分,这三 ...
1.线程同步概念线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。 而最让人无语的是,线程同步的目的就是让各个线程去排队使用资源,而不是让线程同时去使用资源。
假设有 4 个线程 A、B、C、D,当前一个线程 A 对内存中的共享资源进行访问的时候,其他线程 B, C, D 都不可以对这块内存进行操作,直到线程 A 对这块内存访问完毕为止,B,C,D 中的一个才能访问这块内存,剩余的两个需要继续阻塞等待,以此类推,直至所有的线程都对这块内存操作完毕。 线程对内存的这种访问方式就称之为线程同步,通过对概念的介绍,我们可以了解到所谓的同步并不是多个线程同时对内存进行访问,而是按照先后顺序依次进行的。
为什么要线程同步在研究线程同步之前,先来看一个两个线程交替计数(每个线程数 50 个数,交替数到 100)的例子:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#include &l ...
1.虚拟地址空间虚拟地址空间是一个非常抽象的概念,先根据字面意思进行解释:
它可以用来加载程序数据(数据可能被加载到物理内存上,空间不够就加载到虚拟内存中)
它对应着一段连续的内存地址,起始位置为 0。
之所以说虚拟是因为这个起始的 0 地址是被虚拟出来的, 不是物理内存的 0 地址
虚拟地址空间的大小也由操作系统决定,32位的操作系统虚拟地址空间的大小为 232 字节,也就是 4G,64 位的操作系统虚拟地址空间大小为 264 字节,这是一个非常大的数,感兴趣可以自己计算一下。当我们运行磁盘上一个可执行程序, 就会得到一个进程,内核会给每一个运行的进程创建一块属于自己的虚拟地址空间,并将应用程序数据装载到虚拟地址空间对应的地址上。
进程在运行过程中,程序内部所有的指令都是通过 CPU 处理完成的,CPU 只进行数据运算并不具备数据存储的能力,其处理的数据都加载自物理内存,那么进程中的数据是如何进出入到物理内存中的呢?其实是通过 CPU 中的内存管理单元 MMU(Memory Management Unit)从进程的虚拟地址空间中映射过去的。
意义通过上边的介绍大家会感觉到一头雾 ...
1.线程概述
多线程和多进程都能够提高程序的并发性,但多线程对系统资源消耗更少,且多线程和多进程效率都是差不多的
cpu会将单位时间分为很多份,每一份叫时间片,由系统进行调度,每个线程执行时都需要抢时间片,抢到的线程就执行成为运行态,没抢到就处于就绪态,执行完之后又成为就绪态继续抢时间片(都是随机的,无序运行)。
线程是轻量级的进程(LWP:light weight process),在 Linux 环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解,进程是资源分配的最小单位,线程是操作系统调度执行的最小单位。
先从概念上了解一下线程和进程之间的区别:
进程有自己独立的地址空间,多个线程共用同一个地址空间
线程更加节省系统资源,效率不仅可以保持的,而且能够更高
在一个地址空间中多个线程独享:每个线程都有属于自己的栈区,寄存器 (内核中管理的)
在一个地址空间中多个线程共享:代码段,堆区,全局数据区,打开的文件 (文件描述符表) 都是线程共享的
(详细见b ...