• 算法(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]

        

       

  • 相关阅读:
    Java打jar包详解
    用户体验评价
    本周总结(13)
    本周总结(12)
    第一阶段意见评论
    本周总结(11)
    冲刺计划第十天
    冲刺计划第九天
    冲刺计划第八天
    冲刺计划第七天
  • 原文地址:https://www.cnblogs.com/bigdata-stone/p/10200682.html
Copyright © 2020-2023  润新知