左神算法笔记: 1. 认识复杂度、对数器、二分法与异或运算

本文介绍了算法评估的关键因素,包括时间复杂度、空间复杂度和常数时间操作。重点讲解了选择排序、冒泡排序和插入排序的时间复杂度分析,以及如何利用对数器进行算法正确性的测试。二分法的应用场景和逻辑也被详细阐述,并结合异或运算展示了其在问题解决中的独特作用。
摘要由CSDN通过智能技术生成

#algorithem/左神算法/基础 #sorting #XOR


  1. 评估算法优劣的核心标准
    1. 时间复杂度(流程决定)
    2. 额外空间复杂度(流程决定)
    3. 常数项时间(实现细节决定)
  2. 常数时间的操作
    1. 算数运算-加减乘除
    2. 位运算( >>[带符号右移]/ >>>[不带符号右移]/ <</ |/ &/ ^)
    3. 赋值、比较、自增、子减
    4. 数组寻址
  3. 三种排序
    1. 选择排序:遍历整个数组找最大,放在最后
    2. 冒泡排序:相邻的两个数比较谁大谁放在后面
    3. 插入排序:第k次循环的时候,保证k角标之前的数组有序
      • 第k个数字往前冒泡
      • ::数据的初始状况会影响时间复杂度::
        • 已排好的数组:O(N)
        • 完全反着排的数组:O(N^2) -> 最差情况
  4. 对数器(用于测试)
    1. 有一个你想要测的方法a,
    2. 实现一个绝对正确但是复杂度不好的方法b
    3. 实现一个随机样本产生器
    4. 实现比对的方法
    5. 把方法a和方法b比对很多次来验证方法a是否正确。
    6. 如果有一个样本使得比对出错,打印样本分析是哪个方法出
    7. 当样本数量很多时比对测试依然正确,可以确定方法a已经
      正确。
  5. 二分法:构建出一种可以排掉另外一边的逻辑
    • n * 2 + 1 = ( n << 1) | 1
    • eg. 局部最小数:返回一个无序的,去重的数组中 比左右的数都小的数
      • 逻辑:通过判断中间的数和它相邻的数的大小关系来判断这两个数处于递增段还是递减段
	public static int getLessIndex(int[] arr) {
   
        if (arr == null || arr.length == 0) {
   
            return -1; // don't exists
        }
        if (arr.length == 1 || arr[0] < arr[1]) {
   
            return 0; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值