搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
编程领航者
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Spring和Spring boot常用的注解_spring boo框架能使用spring注解吗
2
算法42:天际线问题(力扣218题)---线段树
3
【面经】蚂蚁金服一二三面的面经总结(内推实习方面)
4
JAVA 8 的新特性_java8新特性
5
本地部署Stable Diffusion教程,详细教学,已安装成功,无科学上网版_stable diffusion pc版
6
spring data jpa repository一套代码兼容多种数据库_java 封装repository适配多种数据库
7
adb详细教程(五)-复制文件、截屏、录屏_adb 复制文件
8
国基北盛-openstack-容器云-环境搭建_国基北盛容器云
9
SSM框架的基本概念(什么是ssm框架?)
10
【Arduino】库分析及如何编写自己的Arduino库_arduino 编写库
当前位置:
article
> 正文
C++常用算法总结_c++算法
作者:编程领航者 | 2024-02-01 09:25:38
赞
踩
c++算法
基本的C++算法分为三类:
排序算法
、树算法、图算法
算法思想有三种:递推、分治、动态规划 以及 贪心算法。
本文将简要介绍上面三类算法,介绍时穿插介绍算法思想。
一、排序算法
1、基本O(n^2)排序算法: (对基本排序算法的时间复杂度分析主要考虑 比较次数、数据交换次数)
冒泡排序:针对数组、本地排序、需要交换数据。O(1)额外空间
选择排序:一般针对数组、本地排序、需要交换数据。O(1)的额外空间
插入排序:可以是针对数组的本地排序,此时需要移动大片数据,但是比较次数是O(N*logN)。如果是针对链表,比较次数是O(N^2),但是不需要交换数据。
注意:一般排序都是针对数组的本地排序,数组与链表相比,可以随机访问,空间使用效率更高(链表需要存放指针),而链表一般对于插入与删除操作有更好的性能。
2. O(N*logN)算法
快速排序:针对数组的本地排序,时间复杂度平均O(N*logN),最坏时O(N^2)。空间复杂度O(1)
归并排序:可以针对数组,也可以针对链表。针对数组时时间复杂度为O(N*logN),空间复杂度为O(N)
3. 堆排序
1991年计算机先驱奖获得者、斯坦福大学计算机科学系教授
罗伯特·弗洛伊德
(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法( Heap Sort )
堆是一种非常高效的数据结构,可以用数组来表示堆。
堆排序是针对数组的本地排序,时间复杂度为O(N*logN),空间复杂度为O(1)
对于降序排列时用最小堆,首先建立堆,然后将第一个元素(堆头)与组后一个元素交换。找到了排列的最后一个元素,然后再调整前N-1个元素为最小堆,依次类推,即完成排序。
注意:堆得建立, 堆的建立的时间复杂度为O(N*logN),可以有多种方法建立堆
4. 基数排序
数据的取值范围不大,利用bitmap
5. 外排序
归并排序,多路归并排序(利用堆实现多路归并排序)
使用堆进行多路排序时,堆中的每个元素同附加上一个域,存放该元素来自那一路
堆一般还可以用于TopK算法,求TopK最大可以使用K个元素的最小堆维护K个最大元素,对原始数组扫描一遍即可。
二、树的算法
树一般用链表实现,通常用树数据结构实现数据的快速插入、删除、查找。
1. 平衡二叉查找树
RB-Tree、 AVL、 Treap、 伸展树(无需存放额外信息)
2. B树
用于建立文件系统或数据库的索引。B树的设计目标是减少IO访问次数。B树也是一棵平衡树
3. 二项树、二项堆、费波那奇堆
三、图的算法
1. 图的表示
有向图、无向图 的 邻接表表示、矩阵表示
2. 广度优先搜索、深度优先搜索
广度优先搜索(BFS):找到从单个源点到所有点得
最短路径
,适用于有向图、无向图。算法发杂度为O(V+E),注意算法对应图的边没有权重。算法使用队列实现广度优先。算法使用三个辅助变量、color、paraent、distance数组。搜索后的parent构成广度优先树
深度优先搜索(DFS):可以随意从一个节点开始,遍历树的所有节点,使用于有向图、无向图。搜索构成森林。算法通过递归方式实现,依次递归完成后可能只搜索整个连通树的部分节点,因此需要从新任意选择一个节点从新开始DFS,整个搜索结果构成搜索森林。算法使用三个辅助变量:color,v,f。v表示搜索到该节点时间,f表示该节点的邻接节点都扫描完成的时间。
注意DFS可以完成拓扑排序。利用f出现时间的降序就是拓扑序,可以在深度优先搜索的过程中得到该排序。
DFS算法还可以用于发现强连通分支。
3. 最小生成树
针对无向连通图的,常见的算法有 Kruskal算法和Prim算法
Kruskal算法
将所有的边非降序排列,所有的顶点初始化为不相交集合,每次取一个边,如果该边属于不同的集合,则该边加入解集,同时更新不想交集合。注意:不想交集合实现有专门的数据结构。
Prim算法
该算法与Dijkstra算法类似,每次加入已覆盖集合A和未覆盖集合B之间最短的边。
4. 最短路径
有权值的最短路径问题。可以是有向图,可以是无向图。权值可以为负值。
变种:点与点之间最短路径、固定终点最短路径、所有点之间最短路径、最长路径(将权值去负值利用bellman-ford算法即可)
Bellman-Ford算法
惊醒V-1遍松弛遍历,每次遍历,按照一定顺序,依次将所有的边松弛一遍。结束后,对所有的边进行一次check,如果有边不符合松弛条件,则返回false,表明图中存在负权值的环(该特性可以用于检测有向图中得环),算法复杂度O(VE)
Dijkstra算法
只能针对于正值的边。算法复杂度O(V^2)
5. 求所有点之间的最短路径
矩阵上得动态规划算法。
Floyd-Warshall算法,d_ij(k) 表示从顶点i到顶点j,中间节点只包含{1、2、... k}的最短路径。d_ij(n)即为所求。
Floyd-Warshall算法可以用于求任意两个顶点是否可达
声明:
本文内容由网友自发贡献,转载请注明出处:
【wpsshop博客】
推荐阅读
article
matlab
----GA
遗传算法
_
matlab
遗传算法
工具箱
ga
函数
...
matlab
----GA
遗传算法
_
matlab
遗传算法
工具箱
ga
函数
matlab
遗传算法
工具箱
ga
函数
...
赞
踩
article
什么是
TensorFlow
_
tensorflow
是什么...
阅读本文以了解更多关于
TensorFlow
的知识,并了解如何在项目中使用它。
TensorFlow
教程目的:在今天的Ten...
赞
踩
article
【
计蒜客
题解/
洛谷
题解】
P1114
/
T1853
“非常
男女
”计划
_
计蒜客
洛谷
...
题目概况
计蒜客
链接: https://nanti.jisuanke.com/t/
T1853
洛谷
链接: https://w...
赞
踩
article
java
中
判断
字符串
是数字或日期的
正则表达式
_
java
使用
正则表达式
判断
字符串
只能为年月...
private boolean isNumber(String n) { //
判断
字符串
是否为数字:正负整数、正负小...
赞
踩
article
随机
森林
实例(R
语言
实现)
_
r
语言
随机
森林
...
随机
森林
实例
_
r
语言
随机
森林
r
语言
随机
森林
1.可以先查询一下路径(可以是数据所在的路径) 需要...
赞
踩
article
tyvj1391
走廊
泼水节
_话说
中
中
带领
的
oier
们
打算举行
泼水节
...
kruskal_话说
中
中
带领
的
oier
们
打算举行
泼水节
话说
中
中
带领
的
oier
们
打算举行
泼水节
...
赞
踩
article
matlab
优化
工具箱
多
目标
优化
,紧急求助-关于用
Matlab
遗传
工具箱
进行“
多
目标
优化
”的计算.....
该楼层疑似违规已被系统折叠隐藏此楼查看此楼紧急求助-关于用
Matlab
遗传
工具箱
进行“
多
目标
优化
”的计算我正在挣扎于毕业...
赞
踩
article
SpringBoot
-监听
应用
启动
与
关闭
的
回调
钩子_
springboot
服务
关闭
回调
...
SpringBoot
-监听
应用
启动
与
关闭
的
回调
钩子在使用
SpringBoot
过程中,可能会遇到一些业务场景如:随
应用
启动
...
赞
踩
article
【LLM多
模态
】
Cogview3
、
DALL
-E3、
CogVLM
、
CogVideo
模型
...
丹青
模型
基于原生中文语料数据及网易自有高质量图片数据训练,与其他文生图
模型
相比,丹青
模型
的差异化优势在于对中文的理解能力...
赞
踩
article
随机
森林
c++
_
随机
森林
RandomForest
挖掘生物标记
预测
分类...
随机
森林
简介如果读者接触过决策树(Decision Tree)的话,那么会很容易理解什么是
随机
森林
。
随机
森林
就是通过集成...
赞
踩
article
RabbitMQ
的核心
组件
和五种常用
模式
_
rabbitmq
五大
组件
...
1,简单
模式
生产者Producer:package com.lp.test;import com.
rabbitmq
.cl...
赞
踩
article
Java9
,
10
,
11的新特性_
java9
java
10
新特性...
jdk91. 目录结构改变2. 模块化系统使用junit也必须要先在module-info.java下先requires...
赞
踩
article
ubuntu
20.4 更新中科大
软件
源_
ubuntu
jammy
zhongkeda
...
在编辑器中,你会看到当前的
软件
源列表。请根据你的Ubuntu版本进行相应的更改。保存文件并退出编辑器。_
ubuntu
j...
赞
踩
article
python
爬虫
学习
之解析_
BeautifulSoup
...
注:Python3.10+,使用 Beautiful Soup 时出现错误“AttributeError 'collec...
赞
踩
article
第3关:
基于
支持
向量
机
的
文本
分类
...
根据本关所学有关
支持
向量
机
的知识,编写
基于
支持
向量
机
理论进行
文本
分类
的程序,并通过所有测试用例。_
基于
支持
向量
机
的
文本
分...
赞
踩
article
遗传算法
(
Genetic
Algorithm,GA)-基于MATLAB环境实现_
genetic
al...
genetic
algorithm
,美国Holland教授创立,基于达尔文进化论和孟德尔的遗传学说。
遗传算法
类比了生物界...
赞
踩
article
5个
令人兴奋
的机器
学习
深度
技术
项目
...
From time to time I would read some ML/AI/DL papers just to ...
赞
踩
article
4个
快速
入门
Python
的
方法,看完你就懂了_
python
快速
入门
...
今天给想入行
Python
的
新手们总结4个可以
快速
学习
Python
的
方法,看完你就懂了。具体如下:1、挑选合适
的
Pytho...
赞
踩
article
看完这篇
python
学习
路线图
,
你的
Python
入门基础就差不多了_
python
入门
学习
路线图
...
全民学
Python
的话题铺天盖地
,
中国的
Python
学习
者是全球第一
,
现在孩子都会
,
学习
它来体现自身的价值?所以
,
不论竞...
赞
踩
article
如何用
python
实现
支持
向量
机
(SVM)_
svm
支持
向量
机
python
代码
...
支持
向量
机
的原理简单概括来说,就是在样本空间寻找最佳分类面即超平面,将训练样本分开。对于样本空间,可能存在多个划分超平面...
赞
踩
相关标签
matlab
算法
c++
java
正则表达式
开发语言
intellij idea
随机森林
机器学习
kruskal
matlab优化工具箱多目标优化
spring boot
生命周期
钩子
监听
回调
多模态
大模型
cogview
cogvlm
随机森林c++
队列
交换机
rabbitmq