【算法】时间复杂度以及O(N^2)的排序

目录

1.常数时间的操作

2.时间复杂度

2.1.以选择排序为例

2.2.O(n^2)从何而来

2.3.冒泡排序

2.3.1.抑或运算

2.4.插入排序

3.二分法

3.1.局部最小

4.递归

4.1.递归行为时间复杂度的估计


1.常数时间的操作

一个操作如果和样本的数据量无关,每次都是固定时间内完成的操作,叫做常数操作

时间复杂度为一个算法流程中,常数数量的一个指标,常用O来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中发生了多少次常数操作,进而总结出常数操作数量的表达式

在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果为f(N),那么时间复杂度为O(f(N))

评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同样本数据下的实际运行时间,也就是“常数项时间”

  • 常数操作:int a = arr[i]; 或 +-*/ 或 位运算 等
  • 非常数操作:int b = 链表.get(i);

2.时间复杂度

2.1.以选择排序为例

时间复杂度O(N^2),额外空间复杂度O(1)

设数组长度为N,我们遍历N次,每次把遍历到的最小值放在最左边的位置上,同时把左边界向右移动一位

我们每一次找出最小的数、次小的数、次次小的数...待寻找的区间不断被压缩

这是一种基础且低效的查找方式,它的时间复杂度是O(n^2)

2.2.O(n^2)从何而来

数一数一共进行了多少次常数操作

第一次遍历时,遍历了N次,比较了N次,交换了1次

第二次遍历时,遍历了N-1次,比较了N-1次,交换了1次

......

遍历:N + N-1 + N-2 + N-3 + ...

比较:N + N-1 + N-2 + N-3 + ...

swap:N次

三者相加 = aN^2 + bN + c只要高阶项为N^2

2.3.冒泡排序

时间复杂度O(N^2),额外空间复杂度O(1)

相邻两个数字进行比较,大的数字往右移,一共遍历N-1次,第一次从第1个元素开始与相邻后一个元素比较,直到第N-1个元素与第N个元素比较完为止,此时当前数组中最大的元素一定被排序到了最后一位。接着继续遍历前N-1个元素,第二次遍历结束后,前N-1个元素的最大值一定被排序到了倒数第二位...

public static void bubbleSort(int[] arr) {
  if (arr == null || arr.length < 2) {
    return;
  }
  for (int e = arr.length-1; e > 0; e--) {
    for (int i = 0; i < e; i++) {
      if (arr[i] > arr[i+1]) {
        swap(arr, i, i+1);
      }
    }
  }
}

//交换arr的i和j位置上的值
public static void swap(int[] arr, int i, int j) {
  arr[i] = arr[i] ^ arr[j];
  arr[j] = arr[i] ^ arr[j];
  arr[i] = arr[i] ^ arr[j];
}
2.3.1.抑或运算

相同为0,不同为1

抑或运算还可以理解为无进位相加

  • 抑或运算的性质

(1) 0^N=N N^N=0

(2) 交换律:a^b = b^a

结合律:(a^b)^c = a^(b^c)

(3)同一批数进行抑或结果永远相同

//怎么交换两个数的值
a = a^b;
b = a^b; //即b = (a^b)^b = a^(b^b) = a^0 = a
a = a^b;

a和b的值可以相等,但这样做的前提是a与b在内存里是两块独立的区域,在数组中两个指针所指向的位置不能相同

  • 与抑或有关的面试题

(1)

在一个数组中只有一种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到出现了奇数次的数?要求时间复杂度O(N),空间复杂度O(1)

答:

int eor = 0;
for (int cur : arr) {
  eor ^= cur;
}
return eor;

(2) 在一个数组中只有两种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到出现了奇数次的数?要求时间复杂度O(N),空间复杂度O(1)

  • 为什么抑或运算满足交换律与结合律

用“无进位相加”解释:一组二进制数相加的结果与什么有关,与在某个二进制位上1的个数有关,与这些1出现的次序无关。在无进位相加时,偶数个1相加的结果是0,奇数个1相加的结果是1

//假设两种出现奇数次的数是a、b,a!=b
int eor = 0;
for (int cur : arr) {
  eor ^= cur;
}
//eor == a^b != 0 => eor一定在某一位上等于1(int32位)
//假设eor的第x位为1
int eor_ = 0;
for (int cur : arr) {
  if (cur的第x位等于0) {
    eor_ ^= cur;
  }
}
//eor == a 或 eor == b 而另一个数则是eor^eor_

现在的问题是,eor的第几位是1?

我们选择最右侧的1

//找到eor最右侧的1
int rightOne = eor & (~eor + 1);
//cur的第x位为0这样表示
cur & rightOne == 0;

2.4.插入排序

时间复杂度O(N^2),额外空间复杂度O(1)

一共排序N = arr.length次,第一次排序前1个数,第二次排序前2个数...每次都把当前范围内最右边的数向左移,直到左边的数小于当前数字为止,此时该范围内的数必定有序

​​​​​​​

对于不同的数据,插入排序的时间复杂度不同

假如数据如下

时间复杂度为O(N^2)

假如数据如下

时间复杂度为O(N)

我们约定,时间复杂度是最坏情况下的算法表现,所以插入排序的时间复杂度是O(N^2)

public static void insertionSort(int[] arr) {
  if (arr == null || arr.length < 2) {
    return;
  }
  for (int i = 1; i < arr.length; i++) { //0~i做到有序
    for (int j = i-1; j >= 0 && arr[j] > arr[j+1]; j--) {
      swap(arr, j, j+1);
    }
  }
}
​
public static void swap(int[] arr, int i, int j) {
  arr[i] = arr[i] ^ arr[j];
  arr[j] = arr[i] ^ arr[j];
  arr[i] = arr[i] ^ arr[j];
}

3.二分法

一个有序数组找某个数是否存在

如果遍历,算法时间复杂度O(N),没有用到有序这一特性

我们每次将当前数组的中间位置元素与待查找元素比较,中间元素小,那就查找右侧子数组,反之查找左侧

每次查找都要“砍去”一半数组,数一数一共砍了几次即可得到时间复杂度O(logN)

3.1.局部最小

无序也可以用二分

长度为N的数组,规定相邻位置的元素一定不相等,如果0位置的数比1位置的数小,那么0位置的数是局部最小;如果N-1位置的数比N-2位置的数小,那么N-1位置的数为局部最小;对于中间位置i,如果i位置的数不仅比i-1位置的数小,而且比i+1位置的数小,那么i位置的数为局部最小。易得该数组必定存在至少一个局部最小

(1) 先看0位置的数是否小于1位置的数,若小则直接返回

(2) 看N-1位置的数是否小于N-2位置的数,若小则直接返回

(3) 我们取中点位置M,若[M] > [M-1],则向左侧子数组查找;若[M] < [M-1]且[M] > [M+1],则向右侧子数组查找;若都不满足,则[M]为局部最小

4.递归

一道题引入递归

问:

找到一个数组的最大值

答:

不断把当前数组拆成两个子数组,返回两个子数组的最大值中较大的那个

public static int getMax(int[] arr) {
  return process(arr, 0, arr.length-1);
}
​
public static int process(int[] arr, int L, int R) {
  if (L == R) {
    return arr[L];
  }
  int mid = L + ((R - l) >> 1);
  int leftMax = process(arr, L, mid);
  int rightMax = process(arr, mid+1, R);
  return Math.max(leftMax, rightMax);
}

对该数组进行递归

画出它的递归结构图

把递归的过程理解为一棵多叉树,每一个节点都通过子节点为自己汇总信息之后才能继续往上返回,栈空间就是整棵树的高度

4.1.递归行为时间复杂度的估计

  • master公式

满足子问题等规模的递归都可以用master公式求时间复杂度

T(N) = a*T(N/b) + O(N^d)

T(N)指的是母问题的数据量是N级别的

T(N/b)指的是子问题的规模都是N/b

a指的是子问题的调用次数

O(N^d)指的是除了调用子问题之外,剩下过程的时间复杂度

值得注意的是a/b未必等于1,因为以下式子同样满足master公式

T(N) = 2T(2N/3) + O(1)

结论:

logba < d ====> O(N^d)

logba > d ====> O(N^(logba))

logba == d ====> O((N^d)*logN)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951254.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥

从下方的偏旁部首中选在1--3个组成上面文章中的文字&#xff0c;完成的文字标红 不喜勿喷 《满江红》 其中用到了两个文件 strdata.json parameters.json 这两个文件太大 放到资源中了 资源文件 <template><view class"wenzi_page_main"><view c…

【杂记】qt

1、终端下载PySide6以转换文件格式&#xff1a;pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple 命令提示符下载完毕后&#xff1a;powerShell &#xff1a;cd 跳转到文件对应地址 &#xff08;1、pyside6-uic.exe test.ui -o test.py #将Ui界面文件转换成…

宁德时代2025年Verify入职测评语言理解及数字推理真题SHL题库汇总、考情分析

宁德时代社招Verify入职测评对薪酬有着重要影响&#xff0c;其规定正确率达到80%才能顺利通过测评。这体现了公司对人才专业素养与能力的严格要求&#xff0c;旨在筛选出真正符合岗位需求的优秀人才。测评内容涵盖了专业知识、技能运用、逻辑思维等多方面&#xff0c;只有综合能…

Jenkins-持续集成、交付、构建、部署、测试

Jenkins-持续集成、交付、构建、部署、测试 一: Jenkins 介绍1> Jenkins 概念2> Jenkins 目的3> Jenkins 特性4> Jenkins 作用 二&#xff1a;Jenkins 版本三&#xff1a;DevOps流程简述1> 持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff0…

Flink系统知识讲解之:如何识别反压的源头

Flink系统知识之&#xff1a;如何识别反压的源头 什么是反压 Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念&#xff0c;强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理&#xff0c;这里有…

Go学习:多重赋值与匿名变量

1. 变量的多重赋值 1.1 基本语法格式 go语言中&#xff0c;可以将多个赋值语句 合并成 一句&#xff0c;比如&#xff1a; a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以简练成以下格式a, b, c : 10, 20, 30 1.2 交换变量值 当需要交换两个变量的值时&#…

ArkUI-应用数据持久化

应用数据持久化&#xff0c;是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象&#xff0c;存储介质上的数据形态可能是文本、数据库、二进制文件等。 HarmonyOS标准系统支持典型的存储数据形态&#xff0c;包括用户…

SOLID原则学习,开闭原则

文章目录 1. 定义2. 开闭原则的详细解释3. 实现开闭原则的方法4. 总结 1. 定义 开闭原则&#xff08;Open-Closed Principle&#xff0c;OCP&#xff09;是面向对象设计中的五大原则&#xff08;SOLID&#xff09;之一&#xff0c;由Bertrand Meyer提出。开闭原则的核心思想是…

西电-算法分析-研究生课程复习笔记

24年秋的应该是张老师最后一次用卷面考试&#xff0c;他说以后这节课的期末考试都是在OJ上刷题了张老师上课还挺有意思的&#xff0c;上完之后能学会独立地思考算法设计问题了。整节课都在强调规模压缩这个概念&#xff0c;考试也是考个人对这些的理解&#xff0c;还挺好玩的哈…

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时&#xff0c;主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2&#xff09;数据库主键的种子值设置的多少 3、解决问题 1&#xff09;数据库主键设置的时自增 3&#xff09;种子值是1 所以排查是数据库的问题 4、继…

上海亚商投顾:沪指探底回升微涨 机器人概念股午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天探底回升&#xff0c;沪指盘中跌超1.6%&#xff0c;创业板指一度跌逾3%&#xff0c;午后集体拉升翻红…

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今&#xff0c;它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习&#xff1f;深度学习是如何应用在视觉检测上的呢&#xff1f; 什么是深度学习&#xff1f; 深度学习是…

基于Spring Boot的海滨体育馆管理系统的设计与实现

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 宠物医院…

深度学习每周学习总结R3(LSTM-火灾温度预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R4中的内容&#xff0c;为了便于自己整理总结起名为R3&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. LSTM介绍LSTM的基本组成部分如何理解与应用LSTM 2. 数据导入3. 数据…

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列&#xff1a;原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下&#xff0c;分布式系统架构愈发复杂&#xff0c;消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”&#xff0c;在古代&#xff0c;各地的信件、物资运…

conda install包时出现CondaHTTPError: HTTP 403 FORBIDDEN for url ....问题,但已经排除镜像源问题

最近连WIFI下包出现如下问题&#xff0c;已排除镜像源问题。但是一直装不上包。 CondaHTTPError: HTTP 403 FORBIDDEN for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/ca-certifica Elapsed: 00:00.202308 An HTTP error occurred when trying to …

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏&#xff0c;而这篇文章讲的就是它…

linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决

前言 今天在使用linux的时候&#xff0c;使用上下键想翻出历史命令时&#xff0c;却出现[[A[[A[[A[[B^[[B这种东东&#xff0c;而tab键补全命令的功能也无法使用。最终发现是由于当前用户使用的shell是/bin/sh的原因。 解决方法 运行以下命令&#xff0c;将默认 shell 设置为…

【操作系统】课程 8文件管理 同步测练 章节测验

8.1知识点导图 它详细地展示了文件的定义、分类、逻辑结构、目录结构以及文件共享和保护的各个方面。下面是对图中内容的文字整理&#xff1a; 文件定义 文件是具有文件名的一组相关信息的集合。 文件分类 按用途分类&#xff1a;系统文件、用户文件、库文件。按存取控制属性分…

1月9日星期四今日早报简报微语报早读

1月9日星期四&#xff0c;农历腊月初十&#xff0c;早报#微语早读。 1、上海排查47家“俄罗斯商品馆”&#xff1a;个别店铺被责令停业&#xff0c;立案调查&#xff1b; 2、西藏定日县已转移受灾群众4.65万人&#xff0c;检测到余震646次&#xff1b; 3、国家发改委&#x…