当前位置: 首页 > news >正文

数据结构笔记01

文章目录

  • 📊📊一时间复杂度和空间复杂度
    • 1.1算法效率
    • 1.2 刷题
      • 题目

📊📊一时间复杂度和空间复杂度

1.1算法效率

  • 时间效率

    • 又称时间复杂度;衡量一个算法的运行速度

    • 定义:算法的时间复杂度是一个函数,定量描述该算法的运行时间。一个算法的运行时间于其中语句的执行次数成正比例。算法中的基本操作的执行次数。为算法的时间复杂度

    • 大O的渐进表示法:大O符号(Big O notation):适用于描述函数渐进行为的数学符号。

    • 如下面的栗子:

   int count=0;
   for(int i=0;i<N;i++){
       for(int j=0;i<N;j++) {
           count++;
       }
   }
   int M=10;
   while(M--) {
       count++;
   }
   cout<<count<<enld;

F(N)=N^2+11

T(N)=O(N^2)

  for(int i=0;i<N;i*2) {
  	cout<<i;
  }

F(N)=logN【注意是以2为底数的对数】

T(N)=O(logN)

  • 推到大O阶方法

    • 用常数1取代运行中的所有加法常数
    • 在修改后的运行此函数中 ,只保留最高结束
    • 如果最高阶数存在且不是1,则去除其系数,即可
  • 默认情况下,我们关注的是算法的最坏运算效率

  • 举例:

  • //Binarysearch
    int Binarysearch(int* a,int n,int x) {
        assert(a);
        int begin=0;
        int end=0;
        while(begin<end) {
            int mid=begin+((end-begin)>>1);
            if(x>a[mid]) {
                begin=mid+1;
            }
            else if(x<a[mid]) {
                end=mid;
            }
            else {
                return mid;
            }
        }
        return -1;
    }
    
  • T(n)=logn 最好的情况:O(1)

  • 空间效率

    • 又称空间复杂度;衡量一个算法所需要的额外空间
    • 递归算法的空间复杂度:递归的栈帧深度,因为递归函数要建立战阵递归需要消耗空间。
    • 斐波那契数列的空间复杂度是O(2^n)。
  • 总结:

    • 时间复杂度不计算时间,计算大概的运算次数。
    • 空间复杂度不计算空间,计算大概定义的变量个数。

1.2 刷题

题目

一个整型数组nums里出两个数字之外,其他数字都出现两次。请找出这两个只出现了一次的数字。要求时间复杂度O(n),空间复杂度O(1)

  • 思路梳理:因为要求了时间复杂度是O(n),所以排除冒泡排序的方法。也不能使用二次遍历的方法。

  • 提示:根据题目的提示:其他数字都出现了两次,想到可以利用异或的方法将出现两次数字变为0,而0与两个出现一次的数字异或得到一个新的数字,但在其二进制位上的能有规律可循

  • 具体的图文讲解:

在这里插入图片描述

  • 代码
#include<iostream>
using namespace std;
int main() {
   int arr[] = {1,3,5,1,8,7,9,7,6,6,9,8};
   int ret = 0;
   //遍历数组将所有的数字进行异或
   for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
   	ret ^= arr[i];
   }
   //找出ret的第m位为1的位
   int m = 0;
   while (m < 8 * sizeof(int)) {
   	//利用与运算寻找二进制位是1的第m位的m
   	if (ret & (1 << m)) {
   		break;
   	}
   	else {
   		m++;
   	}
   }
   //分组 相同的数字必然分为一组,经过以后运算变为0,而0与最终值进行异或结果不变
   int num1 = 0, num2 = 0;
   for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
   	if (arr[i] & (1 << m)) {
   		num1 ^= arr[i];
   	}
   	else {
   		num2 ^= arr[i];
   	}
   }
   cout << num1<<endl;
   cout << num2<<endl;
}

在这里插入图片描述

相关文章:

  • 一种基于双MCU协同的多功能押解脚环
  • 算法系列十:十大经典排序算法之——堆排序
  • Docker获取镜像报错docker Error response from daemon
  • 考虑人机协同的智能工厂多AGV物流调度仿真研究
  • 安装mkimage工具,解决报错“Invalid CPU Type - valid names are:”
  • 卡卷平台接口2
  • 尚硅谷Vue系列教程学习笔记(11)
  • win11任务栏时间显示到秒的操作方法
  • 【Saras算法】TD Learning的一种
  • 可裂解试剂142439-92-7,Biotin-bisamido-SS-NHS ester 性质特点有哪些?
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • 神经网络架构图讲解教程,神经网络架构图讲解图
  • 【分享】使用 PXE + Kickstart 无人值守安装 Linux
  • 我赢助手之爆款内容创作:爆款内容的底层逻辑,检查下自己的内容是否符合呢?
  • ISO认证证书上常见的认可标志
  • [PHP内核探索]PHP中的哈希表
  • 分享一款快速APP功能测试工具
  • 时间复杂度分析经典问题——最大子序列和
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 【知识碎片】第三方登录弹窗效果
  • 230. Kth Smallest Element in a BST
  • angular2开源库收集
  • ERLANG 网工修炼笔记 ---- UDP
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Invalidate和postInvalidate的区别
  • mongo索引构建
  • Redis 懒删除(lazy free)简史
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 关于Java中分层中遇到的一些问题
  • 关于字符编码你应该知道的事情
  • 前端临床手札——文件上传
  • 如何合理的规划jvm性能调优
  • 如何解决微信端直接跳WAP端
  • 使用Swoole加速Laravel(正式环境中)
  • 我的zsh配置, 2019最新方案
  • 译自由幺半群
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 阿里云重庆大学大数据训练营落地分享
  • 第二十章:异步和文件I/O.(二十三)
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #QT项目实战(天气预报)
  • (1)Nginx简介和安装教程
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)STL算法之搜索
  • (70min)字节暑假实习二面(已挂)
  • (java)关于Thread的挂起和恢复
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot掌上博客系统 毕业设计063131