xiaoyi's blog
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub

xuexuguang

后端新秀
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub
  • 学习

  • GitHub技巧

  • 面试

    • 面试问题集锦
    • PHP基础
    • 正则表达式
    • PHP文件操作
    • PHP会话控制
    • 自定义函数及内置函数
    • MVC对比
    • linux
    • MySQL数据库基础
    • MySQL创建高性能的索引
    • MySQL的SQL优化
    • MySQL的高可扩展和高可用
    • MySQL安全
    • 常见算法
      • 冒泡排序原理和实现
      • 算法的概念
      • 时间复杂度和空间复杂度的概念
        • 时间复杂度
        • 空间复杂度
      • 常见的排序算法
      • 常见的查找算法
    • 常见数据结构
    • 高并发解决方案
    • 流量优化
    • 浏览器缓存和数据压缩
    • 图片优化
    • 静态化处理
    • 动态语言并发处理
    • 数据库缓存优化
    • 负载均衡
  • 博客搭建

  • 心情杂货

  • 技术文档

  • 实用技巧

  • 友情链接
  • 更多
  • 面试
xuexuguang
2020-12-31

常见算法

# 冒泡排序原理和实现

# 算法的概念

解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作 一个问题有多种算法,每种算法有不同的效率。

一个算法有五个特征:

  • 有穷性:算法可以计算完,不能无穷尽的计算下去
  • 确切性:每一步都是有意义的
  • 输入项:可以输入
  • 输出项:给一个结果
  • 可行性:可以执行

# 时间复杂度和空间复杂度的概念

算法分析的目的在于选择合适的算法和改进算法,一个算法的评价主要在于时间复杂度和空间复杂度

# 时间复杂度

执行算法所需要的计算工作量,一般来说计算算法是问题规模n的函数f(n),算法的时间复杂度也因此记做T(n)=O(f(n))

问题规模n越大,算法执行的时间的增长率与f(n)的增长率正相关,称做渐进时间复杂度(Asymptotic Time Complexity)

时间复杂度的计算方式 :O(n^2)、O(1)、O(n)

比如:从1到n进行累加,计算了n次,则时间复杂度为O(n)

# 1+2+3+4....+n
$sum = 0; 
for($i=1;$i<=$n;$i++) {
    $sum+=$i;
}
1
2
3
4
5

用常数1来取代所有时间中的加法常数,对于计算次数固定的不论次数是多少,则使用O(1)来进行表示

# 1+2+3+4....+n
$sum = 0; 
for($i=1;$i<=3;$i++) {
    $sum+=$i;
}
1
2
3
4
5

在修改后的运行函数中,只保留最高阶项,对于计算次数如果为n^2+n+1,则使用最高阶来表示O(n^2)

# 1+2+3+4....+n
$sum = 0; 
// 里层循环n次,外层循环n次,计做n^2
for($i=1;$i<=$n;$i++) {
    // 计算n次
    for($j=$i;$j<=$n;$j++) {
        $sum+=$i;
    }
}

// n
for($i=1;$i<=$n;$i++) {
    // 计算n次
    $sum+=1;
}

// 1
echo $n;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

如果最高阶存在且不是1,则去除以与这个项相乘的常数。对于计算次数为2n^2+3n+1,则时间复杂度为O(n^2)

# 1+2+3+4....+n
$sum = 0; 
// 
for($i=1;$i<=$n;$i++) {
    $sum+=$i;
}
1
2
3
4
5
6

常见的时间复杂度

  • 常数阶 O(1)
  • 线性阶O(n)
  • 平(立)方阶O(n^2)/O(n^3)
  • 特殊平方阶:O(n^2/2+n/2)计做O(n^2)
  • 对数阶:O(log2n)
  • 指数阶

效率:值越小,代表效率越高,如下是各个算法的效率排行

O(1) > O(log2n) > O(n) > O(nlog2n) > O(n^2) > O(n>3) > O(2^n) > O(n!) > O(n^n)

最坏情况:最坏情况时的运行时间,一种保证,如果没有特别说明,说的时间复杂度即为最坏情况的时间复杂度 平均情况:期望的运行时间

# 空间复杂度

算法需要消耗的内存空间 ,记作S(n)=O(f(n))。包括程序代码所占用的空间,输入数据所占用的内存空间和辅助变量所占用的内存空间。计算和表达方式与时间复杂度类似,一般用复杂度的渐进性来表示。 有时用空间换时间

# 常见的排序算法

  • 冒泡排序
  • 直接插入排序
  • 希尔排序
  • 选择排序
  • 快速排序
  • 堆排序
  • 归并排序

# 常见的查找算法

  • 二分查找
  • 顺序查找
编辑
#算法面试题
上次更新: 2020/12/31, 06:55:18
MySQL安全
常见数据结构

← MySQL安全 常见数据结构→

最近更新
01
MVC对比
12-31
02
负载均衡
12-31
03
数据库缓存优化
12-31
更多文章>
Theme by Vdoing | Copyright © 2020-2020 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式