图解算法笔记整理

图解算法整理(1)

第一章 算法简介
1.第一种查找算法 二分查找法

二分查找法适用的数组必须是递增的

设置参数:low初始值为0 、high初始值为数组长度减1

判断查询数值item与数组第mid位数字的大小

(Python中’/‘表示浮点数除法,’//'表示整数除法)

Python代码如下

def bSearch(list,item):
    low = 0
    high = len(list) - 1
    while low <= high:
        mid = (low + high) // 2
        gusse = list[mid]
        if item < gusse:
            high = mid
        elif item > gusse:
            low = mid
        elif item == gusse:
            return mid
        else:
            return None

Java代码如下:

public class BinarySearch {
    public static int binarySearch(int[] arr, int item){
        if(arr == null || arr.length == 0 ){
            return -1;
        }
        int low = 0;
        int high = arr.length - 1;
        while(low <= high){
            int mid = (low+high)/2;
            if(item < arr[mid]){
                high = mid;
            }else if(item > arr[mid]){
                low = mid;
            }else if(item == arr[mid]){
                return mid;
            }
        }
        return -1;
    }
}
2.大O表示法

不同的算法随着数据量的增加,算法的运行时间会有不同的增加速度,可以用大O表示法来描述算法运行的有多快。

一些常用的大O运行时间:

O ( l o g n ) O(logn) O(logn) O ( n ) O(n) O(n) O ( n ∗ l o g n ) O(n * logn) O(nlogn) O ( n 2 ) O(n^2) O(n2) O ( n ! ) O(n!) O(n!)

随着运行时间变化效率的变化图:

在这里插入图片描述

  • 算法的速度指的并非是时间,而是操作数的增速
  • 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加
  • 算法运行的时间可以用大 O O O表示法进行表示
  • O ( l o g n ) O(logn) O(logn) O ( n ) O(n) O(n),当需要搜索的元素越多是,前者比后者快的越多。

说明:大 O O O表达式表示的是最糟糕的情况,但是除了最糟糕的情况时间外,还需要考虑平均时间情况,也很重要。

小结:
  • 二分查找的速度( O ( l o g n ) O(logn) O(logn))比简单查找( O ( n ) O(n) O(n))要快很多
  • O ( l o g n ) O(logn) O(logn)比( O ( n ) O(n) O(n)快意味着,所需要搜索的元素越多,前者比后者快的就越多
  • 算法运行时间不是以秒为单位
  • 算法运行时间是从其增速的角度衡量的
  • 算法运行时间用大 O O O表示表示

图解算法整理(2)

第二章 选择排序
1.数组和链表

数组在内存中占用的是一段连续的空间。

链表在内存中的空间可以是不连续的,前一个元素中存储了后一个元素的地址。

数组有索引支持随机访问,链表只支持顺序访问

2. 选择排序

对一个数组A进行大小排序(以降序为例),先检查数组A,取出数组A中最大的元素放入数组B中,再对A进行检查,取出此时最大的元素放入数组B中,继续循环,知道A为空,循环结束,得到的数组B 就是降序数组。

因为每次取A中最大的元素需要对数组n个元素进行检查,并且循环n次,所以选择排序时间复杂度为 O ( n 2 ) O(n^2) O(n2)

java代码如下:

public class SelectionSort {
    public static int [] selectionSort(int [] arr){
        if(arr.length == 0 || arr == null){
            return null;
        }
        int[] narr = new int[arr.length];
        for(int i = 0 ; i < arr.length;i++){
            narr[i] = arr[findMax(arr)];
            arr[findMax(arr)] = 0;
        }
        return narr;
    }
    public static int findMax(int [] arr){
        int max = arr[0];
        int max_index = 0;
        for(int i = 0 ; i < arr.length ; i++){
            if(arr[i] > max){
                max = arr[i];
                max_index = i;
            }
        }
        return max_index;
    }
}

Python代码如下:

def selectionSearch(list):
    nlist = []
    for i in range(0,len(list)):
        max_index = findmax(list)
        nlist.append(list.pop(max_index))
    for i in nlist:
        print(i)
    return nlist

def findmax(list):
    if not list:
        return
    max = list[0]
    max_index = 0
    for i in range(0,len(list)):
        if list[i] > max:
            max = list[i]
            max_index = i
    return  max_index
小结:
  • 计算机内存犹如一堆大抽屉
  • 需要存储多个元素时,可以使用数组或链表
  • 链表的元素是分开的,其中每个元素都存储了下一个元素的地址
  • 数组的读取速度很快
  • 链表的插入和删除速度很快
  • 在同一个数组中,所有元素的类型都必须相同
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值