时间复杂度和运算

news2024/9/27 5:47:45

时间复杂度

        在算法和数据结构中,有许多时间复杂度比 O(1) 更差的情况。以下是一些常见的时间复杂度,按照从最优到最差的顺序排列:

  1. O(1): 常数时间复杂度,操作的运行时间与输入规模无关,是最理想的情况。

  2. O(log n): 对数时间复杂度,常见于分治算法和二分搜索等。

  3. O(n): 线性时间复杂度,操作的运行时间与输入规模成正比。

  4. O(n log n): 线性对数时间复杂度,常见于一些高效的排序算法,如快速排序和归并排序。

  5. O(n^2): 平方时间复杂度,常见于一些简单的嵌套循环算法-选择,冒泡,插入

  6. O(n^k): 多项式时间复杂度,其中 k 是常数,通常表示更高次幂的多项式时间复杂度。

  7. O(2^n): 指数时间复杂度,常见于一些指数级增长的问题,如穷举搜索。

  8. O(n!): 阶乘时间复杂度,通常表示在排列组合问题中的情况。时间复杂度表示形式

对应的"选泡插"排序时间复杂度都是O(n^2)空间复杂度是O(1) 

冒泡排序

时间复杂度:有两个for循环,第一个for循环是每个元素都要与其他的元素比较一遍,所以如果有N个元素,那么最外层的for循环的时间复杂度就是O(N),然后每一次外层的for循环,都会在内部的for循环中两两进行比较,又是O(N),因为是for循环嵌套.所以最后的时间复杂度就是O(n^2),空间复杂度的话-一般来说,除了用户要求的内存空间之外,额外申请的新的空间,则就是空间复杂度,这里用了一个temp临时变量来存储数据,所以该空间复杂度是O(1)   


public class 冒泡排序 {

    public static void main(String[] args) {
        int arr[] = {1, 2, 4, 5, 3, 6, 8, 7};
        //第一层for循环代表的是轮数,从第一个数开始,每个数都要和其他的数进行比较,所以有多少数,总共就有多少轮
        for (int i = 0; i < arr.length; i++) {
            //第二层for循环代表的是如果是逆序则换位置,因为有j+1 为了防止下标越界,所以在第二层for循环的时候,在减1
            for (int j=0;j<arr.length-i-1;j++){
                    if (arr[j]>arr[j+1]){
                        int tepm =arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=tepm;
                    }
            }
        }
        for (int i : arr) {
            System.out.print(i);
        }
    }


}

 选择排序

package 算法;
public class 选择排序 {
    //先在[0~n-1]下标范围内找到最小值放到0位置上;
    //再在[1~n-1]下标范围内找到最小值放到1位置上;
    //依次如此操作,直到最后一个最小值【最大值】放在n-1位置上,完成排序操作;
    public static void main(String[] args) {
        int arr[] = {2, 1, 4, 5, 3, 6, 8, 7};

        for (int i = 0; i < arr.length-1; i++) {
            int minIndex=i;//最小值的下标设为第一个数的下标索引
            //然后第一个数和第二个数开始进行比较,看哪个数是最小的, 如果哪个是最小的,则记住最小值的下标,然后两个数进行交换,直到和其他的元素都比较完后,在走下一个数(也就是第一层for循环)
            for (int j=i+1;j<arr.length;j++){
                minIndex=arr[j]<arr[minIndex]?j:minIndex;
            }
            //交换位置
            int temp =arr[i];
            arr[i]=arr[minIndex];
            arr[minIndex]=temp;

        }
        for (int i : arr) {
            System.out.print(i);
        }
    }


}

插入排序

public class 插入排序 {
    //思路就是:默认第一个数的位置已经确定.从第二个位置开始,如果比第一个位置的数小,则换位置,
    //第三个数再和第二个数比较,如果小于第二个数,则换位置,否则不换,然后继续和第一个位置上的数进行比较,小于则换位置.否则不换, 以此类推
    public static void main(String[] args) {
        int arr[] = {2, 1, 4, 5, 3, 6, 8, 7};
        for (int i = 1; i < arr.length; i++) {
            for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--){
                int temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
        for (int i : arr) {
            System.out.print(i);
        }
    }
}

运算 

异或 (^)

        不同为1,相同为0              有两个特性: a^0=a    a^a=0

    例题1:

      a=1 ,b=2 在不使用第三个临时变量来完成两个数的交换,这里就可以用到异或方法

package 算法;

/**
 * @author : gaoPengShuai
 * @date : 2023/11/21 21:21
 * @modyified By :
 */
public class 异或 {
    public static void main(String[] args) {
        int a =1;
        int b=2;
        System.out.println("交换之前a的值是:"+a+" b的值是:"+b);
        //在不使用第三个变量来完成两个数的交换
        a=a^b;
        b=a^b;
        a=a^b;
        System.out.println("交换之后a的值是:"+a+" b的值是:"+b);
    }
}

运行结果:

交换之前a的值是:1 b的值是:2
交换之后a的值是:2 b的值是:1

Process finished with exit code 0

例题2:

在一个数组中,一个数出现了奇数次,其他的数出现了偶数次.找到该出现奇数次的数
    public static void  test1(){
      //在一个数组中,一个数出现了奇数次,其他的数出现了偶数次.找到该出现奇数次的数
        int arr[] ={1,2,3,2,3,3,1};
        int temp =0;
        for (int i : arr) {
            temp^=i;
        }
        System.out.println(temp);
    }

注意:这两个例题就用到了,a^a=0 然后0^b=b的方法,直接将两个数进行交换,但是值得注意的是,a和b值可以相同,但是内存地址不能相同,因为自己异或自己的结果是0,会将之前的值覆盖为0

例题3:

找到一个数转为二进制后,提取出最右侧的1
    public static void  test3(){
        //找到一个数转为二进制后,提取出最右侧的1
        int a=5;
        int eor=a &(-a);//也可以写成 a&(~a+1)

        System.out.println("值是:"+eor);
    }

运行结果:
值是:1

或 ( | )

 1 or 1=1,1 or 0=1,0 or 0=0,0 or 1=1。参加运算的两个对象只要有一个为1,其值为1

与 (&)

 0&0=0; 0&1=0; 1&0=0; 1&1=1.         两位同时为“1”,结果才为“1”,否则为0

取反( ~ )

~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0

左移(<<)

左移1位:相当于将该数的二进制后面补一个0 ,原理整体向左边走,就是之前的值乘2;

右移(>>)

右移1位:相当于将该数的二进制后面少一位 ,原理整体向右走,就是之前的值除以2;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

源码安装Apache

一、下载Apache,源码安装Apache #下载 [rootlocalhost opt]# wget -c https://mirrors.aliyun.com/apache/httpd/httpd-2.4.58.tar.gz [rootlocalhost opt]# ls httpd-2.4.58.tar.gz [rootlocalhost opt]# tar -xf httpd-2.4.58.tar.gz [rootlocalhost opt]# ls httpd-2.4.58…

移远通信推出六款新型天线,为物联网客户带来更丰富的产品选择

近日&#xff0c;移远通信重磅推出六款新型天线&#xff0c;覆盖5G、非地面网络&#xff08;NTN&#xff09;等多种新技术&#xff0c;将为物联网终端等产品带来全新功能和更强大的连接性能。 移远通信COO张栋表示&#xff1a;“当前&#xff0c;物联网应用除了需要高性能的天线…

【Docker】从零开始:4.为什么Docker会比VM虚拟机快

【Docker】从零开始&#xff1a;4.为什么Docker会比VM虚拟机快 docker有着比虚拟机更少的抽象层docker利用的是宿主机的内核,而不需要加载操作系统OS内核 docker有着比虚拟机更少的抽象层 由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接…

【C++】C++11(1)

文章目录 一、C11简介二、统一的列表初始化1.&#xff5b;&#xff5d;初始化2.std::initializer_list 三、声明1.auto2.decltype3.nullptr 四、STL中一些变化五、右值引用和移动语义1.左值引用和右值引用2.左值引用与右值引用比较3.右值引用使用场景和意义4.右值引用引用左值及…

如何化解从数据到数据资源入表的难题

继数据成为生产要素后&#xff0c;各种跟数据相关的概念就出来了&#xff0c;首先我们要弄明白有关数据的几个高频词汇。数据&#xff1a;指“原始数据”&#xff0c;即记录事实的结果&#xff0c;用来描述事实的未经加工的素材。数据资源&#xff1a;指加工后具有经济价值的数…

使用Pytorch实现linear_regression

使用Pytorch实现线性回归 # import necessary packages import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt# Set necessary Hyper-parameters. input_size 1 output_size 1 num_epochs 60 learning_rate 0.001# Define a Toy datas…

Unity团结引擎使用总结

团结引擎创世版以 Unity 2022 LTS 为研发基础&#xff0c;与 Unity 2022 LTS 兼容、UI 也基本保持一致&#xff0c;使 Unity 开发者可以无缝转换到团结引擎。融入了团结引擎独有功能和优化&#xff0c;未来会加入更多为中国开发者量身定制的功能和优化。 目前正在内测&#xf…

函数模板(成长版)

与普通函数区别&#xff1a;1.多了个template<class T>;2.某些确定类型变不确定类型T 一&#xff1a;引子&#xff1a; #include<iostream> using namespace std; template<typename T> T Max(T a, T b) {return a > b ? a : b; } int main() {int x, …

深信服AC跨三层取mac,绑定ip/mac

拓扑图 目录 拓扑图 1.交换机配置团体名和版本号 2.配置跨三层取mac 3.配置策略 验证&#xff1a; “您的每一次阅读、点赞和分享&#xff0c;都是对我最大的鼓舞和动力。” 如果对亲爱您有所帮助&#xff0c;可以尝试支持一下博主&#xff0c;让博主更有动力 1.交换机配置…

nodejs express vue uniapp新闻发布系统源码

开发技术&#xff1a; node.js&#xff0c;mysql5.7&#xff0c;vscode&#xff0c;HBuilder nodejs express vue uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索新闻&#xff0c;新闻分类&#xff0c;新闻列表 点击新闻进入新闻详情&#xff0…

Ubuntu18 Opencv3.4.12 viz 3D显示安装、编译、移植

Opencv3.*主模块默认包括两个3D库 calib3d用于相机校准和三维重建 &#xff0c;viz用于三维图像显示&#xff0c;其中viz是cmake选配。 参考&#xff1a; https://docs.opencv.org/3.4.12/index.html 下载linux版本的源码 sources。 查看cmake apt list --installed | grep…

如何在IAR软件中使用STLINK V2编译下载和调试stm8单片机

安装使用IAR后&#xff0c;如使用系统默认设置&#xff0c;往往很难正常实现用stlink v2来下载和调试stm8芯片&#xff0c;我的解决方法如下&#xff1a; 1、打开项目的options菜单&#xff1a; 2、在项目的选项菜单中选择ST-LINK作为调试工具&#xff1a; 3、选择额外的输出…

【C+进阶之路】第六篇:C++11

文章目录 一、【C】C11&#xff08;1&#xff09;二、【C】C11&#xff08;2&#xff09; 一、【C】C11&#xff08;1&#xff09; 【C】C11&#xff08;1&#xff09; 二、【C】C11&#xff08;2&#xff09; 【C】C11&#xff08;2&#xff09; &#x1f339;&#x1f33…

AT89S52单片机

目录 一.AT89S52单片机的硬件组成 1.CPU(微处理器) (1)运算器 (2)控制器 2.数据存储器 (RAM) (1)片内数据存储器 (2)片外数据存储器 3.程序存储器(Flash ROM) 4.定时器/计数器 5.中断系统 6.串行口 7.P0口、P1口、P2口和P3口 8.特殊功能寄存器 (SFR) 常用的特殊功…

机器视觉系统选型-环形光源分类及应用场景

环形光源主要分为&#xff1f; 1.环形光源(高角度) 照射光线与水平方向成高角度夹角 外观缺陷检测字符识别PCB基板检测二维码读取- 2.环形光源(低角度) 照射光线与水平方向成低角度夹角各种边缘提取字符识别玻璃断面的损伤检测金属表面刻印、损伤 3.环形光源(高亮) 高亮度远…

STM32出现 Invalid Rom Table 芯片锁死解决方案

出现该现象的原因为板子外部晶振为25M&#xff0c;而程序软件上以8M为输入晶振频率&#xff0c;导致芯片超频锁死&#xff0c;无法连接、下载。 解决方案 断电&#xff0c;将芯片原来通过10k电阻接地的BOOT0引脚直接接3.3V&#xff0c;硬件上置1上电&#xff0c;连接目标板&am…

Polygon Miden VM架构总览

1. 计算类型 Programs程序有2种类型&#xff1a; 1&#xff09;Circuit电路&#xff1a;即&#xff0c;程序即电路。将程序转换为电路。2&#xff09;Virtual machine虚拟机&#xff1a;即&#xff0c;程序为电路的输入。【Miden VM属于此类型】 2. 何为ZK virtual machine…

TensorFlow实战教程(十八)-Keras搭建卷积神经网络及CNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了Keras实现分类学习,以MNIST数字图片为例进行讲解。本篇文章详细讲解了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。基础性文章,希望对您有所帮助! 一…

机器视觉技术在现代汽车制造中的应用

原创 | 文 BFT机器人 机器视觉技术&#xff0c;利用计算机模拟人眼视觉功能&#xff0c;从图像中提取信息以用于检测、测量和控制&#xff0c;已广泛应用于现代工业&#xff0c;特别是汽车制造业。其主要应用包括视觉测量、视觉引导和视觉检测。 01 视觉测量 视觉测量技术用于…

2021秋招-面经

面经总结 微软STCA面试-面经 字节AI lab实习面试记录 腾讯PCG-腾讯新闻面试 百度(AIDU)-内容策略部门面试 百度(AIDU)-搜索策略-机器学习算法工程师 百度(AIDU)-知识图谱部门算法工程师(2020-07-08) 百度(AIDU)-NLP部门算法工程师(2020-07-10) 微软STCA面试-面经 2020-…