zoukankan      html  css  js  c++  java
  • 算法基础

    一、算法时间复杂度的O(n)和log2n的区别

      例如一个print(1) 的时间复杂度 为O(1),那多个print串行呢 结果仍然为O(1)

      一个for循环呢 时间复杂度 为O(n)  这个N取决于传入的参数

           那logn是如何取呢, 需要 一次循环减半.  就为nlog2n

           循环减半的过程 O(logn)

    二、常见的时间复杂度排名

      O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n2logn) < O(n3)

    三、空间复杂度

           使用一个变量为O(1)

    四、斐波那契数列

       递归的效率比较低,因为有重复的子问题

    # 1 1 2 3 5 8 13
    
    # 假设小规模的问题能解的条件下,能设计步骤解决原问题
    
    # 重复计算子问题
    
    # def fib(n):
    #     if n == 0 or n == 1:
    #         return 1
    #     else:
    #         return fib(n-1) + fib(n-2)  O(2^n)
    
    # def fib(n):
    #     res = [1,1]
    #     for i in range(2, n+1):
    #         res.append(res[-1] + res[-2])
    #     return res[-1]
    
    # def fib(n):
    #     if n == 0 or n == 1:
    #         return 1
    #     a = 1
    #     b = 1
    #     c = 0
    #     for i in range(2, n+1):
    #         c = a + b
    #         a = b
    #         b = c
    #     return c
    
    
    def fib(n):
        res = [0,1,1]
    
        for i in range(2,n+1):
            res.pop(0)
            res.append(res[-1]+res[-2])
    
        print(res[-1])
    
    print(fib(100))
    

    五、二分法

    from timewrap import cal_time
    
    @cal_time
    def bin_search(li, val):
        low = 0
        high = len(li) - 1
        while low <= high:  # 候选区有值
            mid = (low + high) // 2
            if li[mid] == val: # 等于证明找到了
                return mid
            elif li[mid] > val: # 大于val移动high
                high = mid - 1
            else:   # li[mid] < val
                low = mid + 1
        return -1
    
    @cal_time
    def bin_search_rec(data_set,value,low,high):
        # 递归查找的二分法
        if low <= high:
            mid = (low + high) // 2
            if data_set[mid] == value:
                return mid
            elif data_set[mid] > value:
                return bin_search_rec(data_set,value,low,mid-1)
            else:
                return bin_search_rec(data_set,value,mid+1,high)
        else:
            return
    
    @cal_time
    def sys_search(li, val):
        try:
            return li.index(val)
        except:
            return -1
    
    li = list(range(0,100,2))
    bin_search(li, 6)
    sys_search(li,6)
    bin_search_rec(li,6,0,99)
    

      

           使用一个列表 O(n)

           使用一个二维数组 O(n2)

  • 相关阅读:
    数据库设计的几个建议
    CAS单点登录和spring securtiy集成
    冒烟测试
    匠人精神
    iOS UIButton 设置图片文字垂直排列
    PHP字符串处理函数
    php 数组的常用函数
    Linux中常用操作命令
    yii2.0高级框架配置时打开init.bat秒退的解决方法 (两种方法)
    前端优化网站性能的14条规则
  • 原文地址:https://www.cnblogs.com/liujiliang/p/10148286.html
Copyright © 2011-2022 走看看