主頁 > 後端開發 > python實作各種演算法詳解,以及時間復雜度

python實作各種演算法詳解,以及時間復雜度

2023-04-07 07:26:59 後端開發

python實作各種排序

image-20230406144037130

image-20230406144222498

1. 快速排序

1:首先取序列第一個元素為基準元素pivot=R[low],i=low,j=high,

2:從后向前掃描,找小于等于pivot的數,如果找到,R[i]與R[j]交換,i++,

3:從前往后掃描,找大于pivot的數,如果找到,R[i]與R[j]交換,j--,

4:重復2~3,直到i=j,回傳該位置mid=i,該位置正好為pivot元素, 完成一趟排序后,以mid為界,將序列分為兩部分,左序列都比pivot小,有序列都比pivot大,然后再分別對這兩個子序列進行快速排序,

以序列(30,24,5,58,16,36,12,42,39)為例,進行演示:

1、初始化,i=low,j=high,pivot=R[low]=30:

i j
30 24 5 58 16 26 12 41 39

2、從后往前找小于等于pivot的數,找到R[j]=12

i j
30 24 5 58 16 26 12 41 39
  • R[i]與R[j]交換,i++
i j
12 24 5 58 16 26 30 41 39

3、從前往后找大于pivot的數,找到R[i]=58

i j
12 24 5 58 16 26 30 41 39
  • R[i]與R[j]交換,j--
i j
12 24 5 30 16 26 58 41 39

4、從后往前找小于等于pivot的數,找到R[j]=16

i j
12 24 5 30 16 26 58 41 39
  • R[i]與R[j]交換,i++
i,j
12 24 5 16 30 26 58 41 39

5、從前往后找大于pivot的數,這時i=j,第一輪排序結束,回傳i的位置,mid=i

Low mid-1 mid mid+1 High
12 24 5 16 30 26 58 41 3

此時已mid為界,將原序列一分為二,左子序列為(12,24,5,18)元素都比pivot小,右子序列為(36,58,42,39)元素都比pivot大,然后在分別對兩個子序列進行快速排序,最后即可得到排序后的結果,

def quicksort(low,high,li):
    if low >= high:
        return li
    i = low
    j= high
    pivot = li[low]
    while i<j:
        while i<j and li[j]>pivot:
            j -= 1
        li[i] = li[j]
        while i<j and li[i]<pivot:
            i += 1
        li[j] = li[i]

    li[j] = pivot
    quicksort(low,i-1,li)
    quicksort(i+1,high,li)
    return li



lists=[30,24,5,58,18,36,12,42,39]
print("排序前的序列為:")
for i in lists:
    print(i,end =" ")
print("\n排序后的序列為:")
for i in quicksort(0,len(lists)-1,lists):
    print(i,end=" ")

2. 冒泡排序

冒泡排序(英語:Bubble Sort)是一種簡單的排序演算法,它重復地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來,遍歷數列的作業是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成,這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端,

冒泡排序演算法的運作如下:

  • 比較相鄰的元素,如果第一個比第二個大(升序),就交換他們兩個,
  • 對每一對相鄰元素作同樣的作業,從開始第一對到結尾的最后一對,這步做完后,最后的元素會是最大的數,
  • 針對所有的元素重復以上的步驟,除了最后一個,
  • 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較,

image-20230405225515789

def bubblesort(li):
    for i in range(len(li)-1,0,-1):
        for j in range(1,i):
            if li[j-1]>li[j]:
                li[j-1],li[j] = li[j],li[j-1]

    return li

li = [54,26,93,17,77,31,44,55,20]
print(bubblesort(li))

3. 插入排序

插入排序(Insertion Sort)是一種簡單直觀的排序演算法,它的作業原理是:通過構建有序序列,對于未排序資料,在已排序序列中從后向前掃描,找到相應位置并插入,

  1. 從第一個元素開始,該元素可以認為已經被排序;
  2. 取出下一個元素,在已經排序的元素序列中從后向前掃描;
  3. 如果該元素(已排序)大于新元素,將該元素移到下一位置;
  4. 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 將新元素插入到該位置后;
  6. 重復步驟2~5,

image-20230405230129654

這個演算法和冒泡排序有點類似,都是兩層for回圈,一個是從正面挨個比,一個是倒著比

def insertsort(li):
    for i in range(1,len(li)):
        for j in range(i,0,-1):
            if li[j-1]>li[j]:
                li[j-1],li[j] = li[j],li[j-1]

    return li

li = [54,26,93,17,77,31,44,55,20]
print(insertsort(li))

4. 希爾排序

希爾排序是先取一個小于待排序串列長度的正整數d1,把所有距離為d1的資料看成一組,在組內進行插入排序,然后取一個小于d1的正整數d2,繼續用d2分組和進行組內插入排序,每次取的分組距離越來越小,組內的資料越來越多,直到di=1,所有資料被分成一組,再進行插入排序,則串列排序完成,

希爾排序是基于插入排序進行優化的排序演算法,在插入排序中,如果資料幾乎已經排好序時,效率是很高的(想一下抓牌和插牌),時間復雜度為 O(n) ,但資料的初始狀態并不一定是“幾乎已經排好序”的,用插入排序每步只能將待插入資料往前移動一位,而希爾排序將資料分組后,每次可以往前移動di位,在di>1時進行的分組和組內排序可以將資料變成“幾乎排好序”的狀態,此時再進行最后一次插入排序,提高效率,

希爾排序的原理如下:

  1. 選擇小于待排序串列長度 n 的正整數序列 d1,d2,...,di,其中 n>d1, d(i-1)>di, di=1 ,作為資料的間隔距離對串列進行分組,這里對 di 的取值和個數沒有要求,只要是整數,d1<n,依次變小即可,

  2. 依次用 d1, ..., di 作為資料的距離對串列進行分組和組內插入排序,一共需要進行 i 輪排序,

  3. 在最后一輪排序前,串列中的資料達到了“幾乎排好序”的狀態,此時進行最后一輪插入排序,

以串列 [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21] 進行升序排列為例,

要進行升序排列,則分組后所有組內插入排序都進行升序排列,本例中以串列長度的length/3作為初始的分組距離 d1 ,d1=4,

  1. 從串列的開頭開始,對所有資料按 d1 作為距離進行分組,分組只保證資料的間隔距離相等,不保證每組的資料個數一樣,只是本例中剛好每組資料一樣多,本例的資料可以分為4組,也就是第1,5,9作為排序物件,然后2,6,10;3,7,11;4,8,12.一共要排序4次,排完序為

    image-20230405232330432

  2. 第二次排序的話,這個距離為4//3 = 1,也就是最后一輪排序,這也和直接插入排序完全一樣了,先將第一個資料作為已排序序列,后面的資料作為未排序序列,然后依次將未排序序列中的資料插入到已排序序列中,

    image-20230405232535609

def shellsort(li):
    n = len(li)
    gap = n//3
    while gap > 0:
        for i in range(gap,n):
            j = i
            while j>=gap and li[j-gap]>li[j]:
                li[j-gap],li[j] = li[j],li[j-gap]
                j -= gap
        gap = gap//3

alist = [54,26,93,17,77,31,44,55,20]
shellsort(alist)
print(alist)

5. 歸并排序

將原問題劃分成 n 個規模較小而結構與原問題相似的子問題;遞回地解決這些問題,然后再合并其結果,就得到原問題的解,從上圖看分解后的數列很像一個二叉樹,

歸并排序采用分而治之的原理:

  1. 將一個序列從中間位置分成兩個序列;
  2. 在將這兩個子序列按照第一步繼續二分下去;
  3. 直到所有子序列的長度都為1,也就是不可以再二分截止,這時候再兩兩合并成一個有序序列即可,

image-20230405233755875

def merge(left,right):
    r,l = 0,0
    res = []
    while r < len(right) and l < len(left):
        if left[l] < right[r]:  # 排序,小于等于的放左邊
            res.append(left[l])
            l += 1
        else:
            res.append(right[r])  # 排序,大的放右邊
            r += 1
    res +=(left[l:])
    res +=(right[r:])
  
    return res

def mergesort(li):
    if(len(li)) <2:
        return li

    mid = len(li)//2
    left = mergesort(li[:mid])
    right = mergesort(li[mid:])
    return merge(left,right)



li = [8,0,4,3,6,2]
print(mergesort(li))

6. 選擇排序

選擇排序(Selection sort)是一種簡單直觀的排序演算法,它的作業原理如下,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾,以此類推,直到所有元素均排序完畢,

選擇排序的主要優點與資料移動有關,如果某個元素位于正確的最終位置上,則它不會被移動,選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換,在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬于非常好的一種,

image-20230406001353868

def selection_sort(alist):
    n = len(alist)
    # 需要進行n-1次選擇操作
    for i in range(n-1):
        # 記錄最小位置
        min_index = i
        # 從i+1位置到末尾選擇出最小資料
        for j in range(i+1, n):
            if alist[j] < alist[min_index]:
                min_index = j
        # 如果選擇出的資料不在正確位置,進行交換
        if min_index != i:
            alist[i], alist[min_index] = alist[min_index], alist[i]

alist = [54,226,93,17,77,31,44,55,20]
selection_sort(alist)
print(alist)

7. 堆排序

堆排序(Heap Sort)是利用堆這種資料結構而設計的一種排序演算法,是一種選擇排序,

堆是具有以下性質的完全二叉樹:每個結點的值都大于或等于其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小于或等于其左右孩子結點的值,稱為小頂堆,

堆排序思路為: 將一個無序序列調整為一個堆,就能找出序列中的最大值(或最小值),然后將找出的這個元素與末尾元素交換,這樣有序序列元素就增加一個,無序序列元素就減少一個,對新的無序序列重復操作,從而實作排序,

演算法實作步驟

  1. 構造初始堆,將給定無序序列構造成一個大頂堆(一般升序采用大頂堆,降序采用小頂堆);
  2. 將堆頂元素與末尾元素進行交換,使末尾元素最大,然后繼續調整堆,再將堆頂元素與末尾元素交換,得到第二大元素;
  3. 重新調整結構,使其滿足堆定義,然后繼續交換堆頂元素與當前末尾元素;
  4. 如此反復進行交換、重建、交換,直到整個序列有序,
def heap_sort(array):
    first = len(array) // 2 - 1
    for start in range(first, -1, -1):
        # 從下到上,從右到左對每個非葉節點進行調整,回圈構建成大頂堆
        big_heap(array, start, len(array) - 1)
    for end in range(len(array) - 1, 0, -1):
        # 交換堆頂和堆尾的資料
        array[0], array[end] = array[end], array[0]
        # 重新調整完全二叉樹,構造成大頂堆
        big_heap(array, 0, end - 1)
    return array


def big_heap(array, start, end):
    root = start
    # 左孩子的索引
    child = root * 2 + 1
    while child <= end:
        # 節點有右子節點,并且右子節點的值大于左子節點,則將child變為右子節點的索引
        if child + 1 <= end and array[child] < array[child + 1]:
            child += 1
        if array[root] < array[child]:
            # 交換節點與子節點中較大者的值
            array[root], array[child] = array[child], array[root]
            # 交換值后,如果存在孫節點,則將root設定為子節點,繼續與孫節點進行比較
            root = child
            child = root * 2 + 1
        else:
            break


if __name__ == '__main__':
    array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
    print(heap_sort(array))

8. 計數排序

計數排序(Counting Sort)是一種不比較資料大小的排序演算法,是一種犧牲空間換取時間的排序演算法,

計數排序適合資料量大且資料范圍小的資料排序,如對人的年齡進行排序,對考試成績進行排序等,

計數排序先找到待排序串列中的最大值 k,開辟一個長度為 k+1 的計數串列,計數串列中的所有初始值都為 0,走訪待排序串列,如果走訪到的元素值為 i,則計數串列中索引 i 的值加1,走訪完整個待排序串列,就可以統計出待排序串列中每個值的數量,然后創建一個新串列,根據計數串列中統計的數量,依次在新串列中添加對應數量的 i ,得到排好序的串列,

def counting_sort(array):
    if len(array) < 2:
        return array
    max_num = max(array)
    count = [0] * (max_num + 1)
    for num in array:
        count[num] += 1
    new_array = list()
    for i in range(len(count)):
        for j in range(count[i]):
            new_array.append(i)
    return new_array
 
 
if __name__ == '__main__':
    array = [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 6]
    print(counting_sort(array))

9. 桶排序

桶排序(Bucket sort)是一種通過分桶和合并實作的排序演算法,又被稱為箱排序,

桶排序先將資料分到有限數量的桶里,然后對每一個桶內的資料進行排序(桶內排序可以使用任何一種排序演算法,如快速排序),最后將所有排好序的桶合并成一個有序序列,串列排序完成,

桶排序需要占用很多額外的空間,對桶內資料進行排序,選擇哪種排序演算法對于性能的影響至關重要,桶排序適用的場景并不多,用得多一點的是基于桶排序思想的計數排序和基數排序,

桶排序的原理如下:

  1. 求出待排序串列中的最大值和最小值,得到資料的范圍,

  2. 根據資料的范圍,選擇一個適合的值構建有限數量的桶,確定每個桶的資料范圍,如資料范圍是[0,100),將資料分成10個桶,第一個桶為[0,10),第二個桶為[10,20),以此類推,

  3. 將待排序串列中的資料分配到對應的桶中,

  4. 對每一個桶內的資料進行排序,這里可以采用任意一種排序演算法,建議采用時間復雜度小的排序演算法,

  5. 將所有桶中的資料依次取出,添加到一個新的有序序列中,串列排序完成,

# coding=utf-8
def bucket_sort(array):
    min_num, max_num = min(array), max(array)
    bucket_num = (max_num-min_num)//3 + 1
    buckets = [[] for _ in range(int(bucket_num))]
    for num in array:
        buckets[int((num-min_num)//3)].append(num)
    new_array = list()
    for i in buckets:
        for j in sorted(i):
            new_array.append(j)
    return new_array
 
 
if __name__ == '__main__':
    array = [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 8]
    print(bucket_sort(array))

本文來自博客園,作者:ivanlee717,轉載請注明原文鏈接:https://www.cnblogs.com/ivanlee717/p/17292751.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549270.html

標籤:Python

上一篇:selenium 小技巧集合(一)

下一篇:Python中,類的特殊方法與內置函式的關聯

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more