Python之演算法

来源:https://www.cnblogs.com/mengqingjian/archive/2018/01/31/8394962.html
-Advertisement-
Play Games

一、什麼演算法 演算法:一個計算過程,解決問題的方法 二、時間複雜度 看代碼: Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<O(n2logn)< Ο(n3)<…<Ο(2^n)<Ο(n!) 三、空間複雜度 空間複雜度:用來評估演算法記憶體占用大小的一個式子 複習:遞歸 遞歸的兩個特點 ...


一、什麼演算法

演算法:一個計算過程,解決問題的方法

二、時間複雜度

看代碼:

           

 

            

 

            

             

           

           

         

                   

               

Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<O(n2logn)< Ο(n3)<…<Ο(2^n)<Ο(n!)

三、空間複雜度

空間複雜度:用來評估演算法記憶體占用大小的一個式子

複習:遞歸

遞歸的兩個特點:

     調用自身

     結束條件

看下麵幾個函數

def func1(x):
     print(x)
     func1(x-1)

def func2(x):
     if x>0:
          print(x)
          func2(x+1)

def func3(x):
     if x>0:
          print(x)
          func3(x-1)

def func4(x):
     if x>0:
          func4(x-1)
          print(x)

def test(n):
    if n == 0:
        print("我的小鯉魚", end='')
    else:
        print("抱著", end='')
        test(n-1)
        print("的我", end='')

test(5)
練習

遞歸實例:漢諾塔問題

            

 

         

t = 0

def hanoi(n, A, B, C):
    global t
    if n > 0:
        hanoi(n-1, A, C, B)
        t += 1
        print("%s -> %s" % (A, C))
        hanoi(n-1, B, A, C)

hanoi(8,'A','B','C')
print(t)
漢諾塔問題

列表查找

 

二分法查找 

使用二分法查找來查找3

      

          

遞歸版本的二分法查找

排序Low B三人組

   冒泡排序

   選擇排序

   插入排序

演算法的關鍵點:

   有序區

   無序區

1、冒泡排序的思路

   

   

冒泡排序---優化

 

import random
from timewrap import *

@cal_time
def bubble_sort(li):
    for i in range(len(li) - 1):
        # i 表示趟數
        # 第 i 趟時: 無序區:(0,len(li) - i)
        for j in range(0, len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]

@cal_time
def bubble_sort_2(li):      #冒泡排序優化
    for i in range(len(li) - 1):
        # i 表示趟數
        # 第 i 趟時: 無序區:(0,len(li) - i)
        change = False
        for j in range(0, len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                change = True
        if not change:
            return

li = list(range(10000))
# random.shuffle(li)
# print(li)
bubble_sort_2(li)
print(li)
冒泡排序

選擇排序的思路

選擇排序代碼

import random
from timewrap import *

@cal_time
def select_sort(li):
    for i in range(len(li) - 1):
        # i 表示趟數,也表示無序區開始的位置
        min_loc = i   # 最小數的位置
        for j in range(i + 1, len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]


li = list(range(10000))
random.shuffle(li)
print(li)
select_sort(li)
print(li)
選擇程式

插入排序思路

插入排序代碼

import random
from timewrap import *

@cal_time
def insert_sort(li):
    for i in range(1, len(li)):
        # i 表示無序區第一個數
        tmp = li[i] # 摸到的牌
        j = i - 1 # j 指向有序區最後位置
        while li[j] > tmp and j >= 0:
            #迴圈終止條件: 1. li[j] <= tmp; 2. j == -1
            li[j+1] = li[j]
            j -= 1
        li[j+1] = tmp


li = list(range(10000))
random.shuffle(li)
print(li)
insert_sort(li)
print(li)
插入排序

排序LOW B三人組------小結

 

快速排序:

   

      

         

 

 

                                                                                        

 

                                                     

from timewrap import *
import random

def _sift(li, low, high):
    """
    :param li:
    :param low: 堆根節點的位置
    :param high: 堆最有一個節點的位置
    :return:
    """
    i = low  # 父親的位置
    j = 2 * i + 1  # 孩子的位置
    tmp = li[low]  # 原省長
    while j <= high:
        if j + 1 <= high and li[j + 1] > li[j]:  # 如果右孩子存在並且右孩子更大
            j += 1
        if tmp < li[j]:  # 如果原省長比孩子小
            li[i] = li[j]  # 把孩子向上移動一層
            i = j
            j = 2 * i + 1
        else:
            li[i] = tmp  # 省長放到對應的位置上(幹部)
            break
    else:
        li[i] = tmp  # 省長放到對應的位置上(村民/葉子節點)


def sift(li, low, high):
    """
    :param li:
    :param low: 堆根節點的位置
    :param high: 堆最有一個節點的位置
    :return:
    """
    i = low         # 父親的位置
    j = 2 * i + 1   # 孩子的位置
    tmp = li[low]   # 原省長
    while j <= high:
        if j + 1 <= high and li[j+1] > li[j]: # 如果右孩子存在並且右孩子更大
            j += 1
        if tmp < li[j]: # 如果原省長比孩子小
            li[i] = li[j]  # 把孩子向上移動一層
            i = j
            j = 2 * i + 1
        else:
            break
    li[i] = tmp


@cal_time
def heap_sort(li):
    n = len(li)
    # 1. 建堆
    for i in range(n//2-1, -1, -1):
        sift(li, i, n-1)
    # 2. 挨個出數
    for j in range(n-1, -1, -1):    # j表示堆最後一個元素的位置
        li[0], li[j] = li[j], li[0]
        # 堆的大小少了一個元素 (j-1)
        sift(li, 0, j-1)


li = list(range(10000))
random.shuffle(li)
heap_sort(li)
print(li)

# li=[2,9,7,8,5,0,1,6,4,3]
# sift(li, 0, len(li)-1)
# print(li)
堆排序代碼
import heapq, random

li = [5,8,7,6,1,4,9,3,2]

heapq.heapify(li)
print(heapq.heappop(li))
print(heapq.heappop(li))

def heap_sort(li):
    heapq.heapify(li)
    n = len(li)
    new_li = []
    for i in range(n):
        new_li.append(heapq.heappop(li))
    return new_li

li = list(range(10000))
random.shuffle(li)
# li = heap_sort(li)
# print(li)

print(heapq.nlargest(100, li))
堆排序代碼1

import random
from timewrap import *
import copy
import sys


def merge(li, low, mid, high):
    i = low
    j = mid + 1
    ltmp = []
    while i <= mid and j <= high:
        if li[i] < li[j]:
            ltmp.append(li[i])
            i += 1
        else:
            ltmp.append(li[j])
            j += 1
    while i <= mid:
        ltmp.append(li[i])
        i += 1
    while j <= high:
        ltmp.append(li[j])
        j += 1
    li[low:high+1] = ltmp


def _merge_sort(li, low, high):
    if low < high:  # 至少兩個元素
        mid = (low + high) // 2
        _merge_sort(li, low, mid)
        _merge_sort(li, mid+1, high)
        merge(li, low, mid, high)
        print(li[low:high+1])


def merge_sort(li):
    return _merge_sort(li, 0, len(li)-1)


li = list(range(16))
random.shuffle(li)
print(li)
merge_sort(li)

print(li)
一次歸併代碼

希爾排序

插入排序
def insert_sort(li):
    for i in range(1, len(li)):
        # i 表示無序區第一個數
        tmp = li[i] # 摸到的牌
        j = i - 1 # j 指向有序區最後位置
        while li[j] > tmp and j >= 0:
            #迴圈終止條件: 1. li[j] <= tmp; 2. j == -1
            li[j+1] = li[j]
            j -= 1
        li[j+1] = tmp

比較


希爾排序
def shell_sort(li):
    d = len(li) // 2
    while d > 0:
        for i in range(d, len(li)):
            tmp = li[i]
            j = i - d
            while li[j] > tmp and j >= 0:
                li[j+d] = li[j]
                j -= d
            li[j+d] = tmp
        d = d >> 1
希爾排序

計數排序

# 0 0 1 1 2 4 3 3 1 4 5 5
import random
import copy
from timewrap import *

@cal_time
def count_sort(li, max_num = 100):
    count = [0 for i in range(max_num+1)]
    for num in li:
        count[num]+=1
    li.clear()
    for i, val in enumerate(count):
        for _ in range(val):
            li.append(i)

@cal_time
def sys_sort(li):
    li.sort()

li = [random.randint(0,100) for i in range(100000)]
li1 = copy.deepcopy(li)
count_sort(li)
sys_sort(li1)
計算排序
from collections import deque

f = open('test.txt','r')

q = deque(f, 3)

for line in q:
    print(line)
問題

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於JSP中的文件上傳和下載操作 先分析一下上傳文件的流程 1-先通過前段頁面中的選擇文件選擇要上傳的圖片index.jsp 2-點擊提交按鈕,通過ajax的文件上傳訪問伺服器端 common.js 3-伺服器端響應保存或者下載保存上傳文件的FileUpload.java 下載文件的FileDown ...
  • Servlet詳解 1.servlet簡單介紹 servlet是javaweb三大組件之一,他與filter ,listener 共同組成了javaweb的三大組件,Servlet(Server Applet)是Java Servlet的簡稱,解釋為運行在伺服器端的java小程式, 作用:用來接收客 ...
  • 1:題目描述 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would ...
  • 首先自己實現一個簡單的連接池: 數據準備: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64), upassword VARC ...
  • 前面我們說了,在python中,一切皆對象。函數也是一個對象,而且函數對象可以被賦值給變數,通過變數也能調用該函數。如: 以上代碼,輸出: 函數對象有一個__name__屬性,可以拿到函數的名字: 以上代碼,輸出: 你會發現,上例中的變數 f 也獲得了sayHello函數的功能,而且本質上它就是 s ...
  • 前言 雖然windows下, tomcat和solr整合起來灰常的方便, 但是, 一般像這種東西, 都很少部署在windows中, 更多的是部署到linux中去. 其實, 步驟是一樣的, 這裡, 我在centos 中再部署一次. 下包 下載地址還是之前的那個: http://mirror.bit.e ...
  • 一、註意規範 註意:(1).XXXmapper.xml 文件中的 namespace 等於mapper 介面地址 (2).XXXmapper.java 介面中的方法輸入參數和 mapper.xml 中statement的parameterType指定的 類型一致。 (3) .mapper.java ...
  • 一、Spring? Spring興起:2003年,由Rod Johnson創建。總的來說,Spring Framwork從它誕生至今都一直為人所稱道,它的偉大之處自此可見一斑。 核心:IOC&AOP IOC 全稱:Inersion of control-->控制反轉。把對象的創建工作交給框架(有意取 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...