数据结构&算法-时间复杂度

Posted 彩色墨水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构&算法-时间复杂度相关的知识,希望对你有一定的参考价值。

时间复杂度

计算机的性能体现主要是程序消耗时间和占用空间大小,如果一个程序算法实现同样的功能,所消耗的时间越短越好,占用的空间越小越好。这里就引入了时间复杂度的概念。
各复杂度消耗时间长度大小排序:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

常见算法的时间复杂度

using System;
using System.Collections.Generic;

namespace TimeComplexity

    class Program
    
        static void Main(string[] args)
        
            Console.WriteLine("时间复杂度");
            Case c = new Case();
            //c.BullsAndCows(100);
            c.SortRandomNumList(20);
        
    


    class Case
    
        //等差数列求和:1+2+3+4+······+n

        //----------时间复杂度 O(n)--------------------------
        int NormCalcSum(int n)
        
            int sum = 0;
            for (int i = 0; i < n; i++)//执行n次
            
                sum += i;
            
            return sum;
        

        //-----------------时间复杂度 O(1)-----------------------
        int ArithCalcSum(int n)
        
            int sum = 0;
            sum = (1 + n) * n / 2;//执行1次
            return sum;
        


            
    



        //猜数字,数字1-n之间,猜中这个数字的次数

        //------------------------时间复杂度 O(logn)------------------
        public void BullsAndCows(int n)
        
            Random rd = new Random();
            int target = rd.Next(1, n);
            int maxnum = n;
            int mygustNumA = 0;
            int mygustNumB = maxnum / 2;
            int gusttimes = 0;
            while (true)
            
                gusttimes++;//最多执行logn次,这里其实是二分法,底数为2,但对于logn,n趋于无穷大时,底数是2还是10,不重要。 
                int temp = mygustNumB;
                Console.WriteLine("猜测的次数:0;目标数字:1;我猜的数字:2", gusttimes, target, mygustNumB);
                double ddd = Math.Abs(mygustNumB - mygustNumA) / 2d;
                if (mygustNumB > target)
                
                    mygustNumB = mygustNumB - (int)Math.Round(ddd);
                
                else if (mygustNumB < target)
                
                    mygustNumB = mygustNumB + (int)Math.Round(ddd);

                
                else
                    break;
                mygustNumA = temp;
            

        


        //给无序数列排序

        //------------------------时间复杂度 O(n²)------------------
        public void SortRandomNumList(int n)
        
            if (n < 1)
            
                return;
            
            Random rd = new Random();

            List<int> myList = new List<int>();
            while (n > 0)
            
                myList.Add(rd.Next(1, 100));
                n--;
            
            Console.WriteLine("---------排序前-----------");
            for (int i = 0; i < myList.Count; i++)
            

                Console.WriteLine(myList[i]);
            


            for (int i = 0; i < myList.Count; i++)
            
                for (int j = i; j < myList.Count-1; j++)//冒泡排序,双层for循环
                
                    if (myList[i] > myList[j + 1])
                    
                        int temp = myList[i];
                        myList[i] = myList[j + 1];
                        myList[j + 1] = temp;
                    
                
            


            Console.WriteLine("---------排序后---------");
            for (int i = 0; i < myList.Count; i++)
            

                Console.WriteLine(myList[i]);
            
        
        
//给无序数列排序

        //------------------------时间复杂度 O(nlogn)------------------


        public int[] GroupingArray(int[] array)
        
            if (array == null || array.Length == 0)
            
                return array;
            
            if (array.Length == 2)//最终分组后只能是2个数或者1个数
            
                Console.WriteLine("最小分拆数组:0,1;", array[0], array[1]);
                int[] temp = new int[2];
                if (array[0] < array[1])
                
                    temp[0] = array[0];
                    temp[1] = array[1];
                
                else
                
                    temp[0] = array[1];
                    temp[1] = array[0];
                

                return temp;

            
            else if (array.Length == 1)//最终分组后只能是2个数或者1个数
            
                Console.WriteLine("最小分拆数组:0;", array[0]);
                int[] temp = new int[1];
                temp = array;

                return temp;

            
            else
            
                int mid = array.Length / 2;
                int[] left = new int[mid];
                for (int i = 0; i < mid; i++)//分拆为两个数组
                
                    left[i] = array[i];
                
                int[] right = new int[array.Length - mid];

                for (int i = mid; i < array.Length; i++)//分拆为两个数组
                
                    right[i - mid] = array[i];

                
                int[] templeft = GroupingArray(left);
                int[] tempright = GroupingArray(right);//递归 logn
                int[] colletArray = new int[templeft.Length + tempright.Length];

                colletArray = SortSimpArray(templeft, tempright);//将两个数组排序
                return colletArray;

            
        

        /// <summary>
        /// 两个有序的数组,合并排序
        /// </summary>
        /// <param name="left"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        int[] SortSimpArray(int[] left, int[] right)
        
            int[] temp = new int[left.Length + right.Length];
            int leftindex = 0;
            int rightindex = 0;
            for (int i = 0; i < temp.Length; i++)//执行n次
            


                if (leftindex >= left.Length)
                
                    temp[i] = right[rightindex];
                    rightindex++;
                
                else if (rightindex >= right.Length)
                
                    temp[i] = left[leftindex];
                    leftindex++;
                
                else if (left[leftindex] < right[rightindex])
                
                    temp[i] = left[leftindex];
                    leftindex++;

                
                else if (left[leftindex] >= right[rightindex])
                
                    temp[i] = right[rightindex];
                    rightindex++;

                

            
            return temp;
        

以上是关于数据结构&算法-时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

最近在研究算法,书上一直说时间是O(logn),但是没有明确说logn的底是啥,这样理解是不是准确?

数据结构与算法时间复杂度的计算

算法概述

算法复杂度

python算法

算法 | 复杂度与计数排序