算法的概念 算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。
简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵魂
1程序 = 算法+数据结构
算法的特征可行性 算法中执行的任何计算步骤都可以分解为基本可执行的操作步,即每个计算步都可以在有限时间里完成(也称之为有效性)
确定性 算法的每一步都要有确切的意义,不能有二义性。例如“增加x的值”,并没有说增加多少,计算机就无法执行明确的运算。
有穷性 算法的有穷性是指算法必须在执行有限个步骤后终止。操作次数不宜过大,不能超过人们事先设定的时间限制。
输入算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法已经给出了初始条件。
输出一个算法可能有1个或多个输出,以反映输入数据加工后的代码,没有输出的算法是没有意义的!
算法的评价通常一个好算法应该达到如下目标:
正确性算法应该正确的解决问题。
可读性算法应该具有较好的可读性,让人们理解算法的作用。
健壮性输入非法数据时,算法也可以做出适当 ...
线性表查找顺序查找算法介绍顺序查找算法又称顺序搜索算法或者线性搜索算法,是所有查找算法中最基本、最简单的,对应的时间复杂度为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;}
效率分析时间复杂度:
最坏情况:若相同则查找成功返回对 ...
MySQL
未读基础篇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 个部分,这三 ...