算法(1)

 一、复杂发

  1.常见的时间复杂度分析方法

    (1):循环次数

    (2)均摊分析

    (3)递归式----主定理

  2.复杂度:

    (1)O(1):基本运算、+、 -、 *、 /、 % 、寻址

    (2)O(logn) :二分查找

    (3)O(n^1/2):枚举约数

    (4)O(n):线性查找

    (5)O(n^2):朴素最近点对

    (6)O(n^3):Floyd最短路径、普通矩阵乘法

    (7)O(nlogn):归并排序,快速排序的期望复杂度,基于比较排序的算法下界

    (8)O(2^n):枚举全部子集

    (9)总结:优秀 O(1) < O(logn) < O(n1/2) < O(n) < O(nlogn)

        可能可以优化 O(n2) < O(n3) < O(2n) < O(n!)

  3.将1,2,3,4.........n序列进行排序,

二、均摊分析

 1. (1)多个操作,一起算时间复杂度
  (2)MULTIPOP的队列,可以一次性出队k个元素
    每个元素只出入队列一次
    动态数组尾部插入操作(vector)
    一旦元素超过容量限制,则扩大一倍,再复制

 2.eg最大子数组和

  给定数组a[1…n],求最大子数组和,即找出1<=i<=j<=n,

  使a[i]+a[i+1]+…+a[j]最大(arrayList)。vector底层的实现是数组,数组的大小是有效的,

  当数组快要放满的时候,就开辟一个原数组两倍大的空间,将原数组复制到新的数组中去

    (1)暴力枚举:三重循环

    (2)优化枚举:两重,去冗余

    (3)贪心法 :一重循环,去冗余

class Solution:
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        ans = -10000000000000
        sum =0
        for i in range(n):#i=0
            sum+=nums[i]
            if sum>ans:
                ans = sum
            if sum<0:    #如果是A就把A抛弃
                sum = 0
            else:
                sum=sum   #如果是B就继续保留
        return ans
本算法的时间复杂度是O(n)

   3.设计一个队列,支持出队、入队、求最大元素

    要求O(1),均摊分析

  4.给定一个正整数组,是否能以3个数构成三角形

    满足a[i]<a[j]+a[k]

      并且a[j]<a[i]+a[k]

      并且a[k]<[i]+a[j]

    

   

原文地址:https://www.cnblogs.com/bigdata-stone/p/10200682.html