數據結構與算法-線性表-線性表的應用

1 線性表

1.5 線性表的應用

1.5.1 線性表的合并

在這里插入圖片描述

【算法步驟】

  1. 分別獲取 LA 表長 mLB 表長 n
  2. LB 中第 1 個數據元素開始,循環 n 次執行以下操作:
    1. LB 中查找第 i 個數據元素賦給 e
    2. LA 中查找元素 e ,如果不存在,則將 e 插在表 LA 的最后。

【代碼實現】

順序表實現:

// 合并兩個線性表:順序表實現。
// 將所有在線性表 LB 中但不在 LA 中的數據元素插入到 LA 中。
void MergeList_Sq(SqList *LA, SqList *LB)
{int m = ListLength(LA);int n = ListLength(LB);for (int i = 1; i <= n; i++){ElemType e;GetElem(LB, i, &e);      // 獲取 LB 中的第 i 個元素if (!LocateELem(LA, &e)) // 如果 LA 中沒有該元素{ListInsert(LA, ++m, e); // 插入到 LA 的末尾}}
}

ListLengthGetElemLocateELemListInsert 可以參考之前順序表章節的實現。

鏈表實現:鏈表的實現方式和順序表幾乎一致,就是把鏈表 LALB 的類型修改為 LinkList 即可。

// 合并兩個線性表:鏈表實現。
// 將所有在線性表 LB 中但不在 LA 中的數據元素插入到 LA 中。
void MergeList(LinkList *LA, LinkList *LB)
{int m = ListLength(LA);int n = ListLength(LB);for (int i = 1; i <= n; i++){ElemType e;GetElem(LB, i, &e);      // 獲取 LB 中的第 i 個元素if (!LocateELem(LA, &e)) // 如果 LA 中沒有該元素{ListInsert(LA, ++m, e); // 插入到 LA 的末尾}}
}

【算法分析】

順序表實現分析:

  1. ListLength 的時間復雜度是 O(1)
  2. LB 順序表要遍歷一遍,這里和表長 n 成正比,而后在循環體內:
    1. LB 順序表中獲取元素 GetElem 的時間復雜度是 O(1)
    2. LA 順序表中查找是否有相關元素 LocateELem,和表長 m 成正比;
    3. 插入到 LA 順序表 ListInsert,因為是插入末尾,所以時間復雜度是 O(1)

因此時間復雜度是:O(m*n)

鏈表實現分析:

  1. ListLength 的時間復雜度和 LALB 的表長mn成正比 ;
  2. LB 順序表要遍歷一遍,這里和表長 n 成正比,而后在循環體內:
    1. LB 鏈表中獲取元素 GetElem 的和表長 n 成正比;
    2. LA 鏈表中查找是否有相關元素 LocateELem,和表長 m 成正比;
    3. 插入到 LA 鏈表表 ListInsert,鏈表的插入時間復雜度是 O(1)

因此時間復雜度是:O(m) + O(n) + O(n*(m+n)) + O(1),取最高階,忽略低階,再根據書中假設 m > n,所以最終時間復雜度就是:O(m*n)

1.5.2 有序表的合并

在這里插入圖片描述

順序表實現

【算法步驟】

  1. 創建一個表長為 m+n 的空表 LC
  2. 指針 pc 初始化,指向 LC 的第一個元素。
  3. 指針 papb 初始化,分別指向 LALB 的第一個元素。
  4. 當指針 papb 均未到達相應表尾時,則依次比較 papb 所指向的元素值,從 LALB 中“摘取”元素值較小的結點插人到 LC 的最后。
  5. 如果 pb 已到達 LB 的表尾,依次將 LA 的剩余元素插人 LC 的最后。
  6. 如果 pa 已到達 LA 的表尾,依次將 LB 的剩余元素插人 LC 的最后。

【代碼實現】

// 合并兩個有序表:順序表實現。
Status MergeList(SqList *LA, SqList *LB, SqList *LC)
{LC->maxsize = LC->length = LA->length + LB->length;           // 合并后的最大長度LC->elem = (ElemType *)malloc(LC->length * sizeof(ElemType)); // 分配初始空間if (LC->elem == NULL){return OVERFLOW;}ElemType *pc = LC->elem; // pc 指向合并后的順序表的第一個元素ElemType *pa = LA->elem; // pa 指向第一個順序表ElemType *pb = LB->elem; // pb 指向第二個順序表ElemType *pa_last = pa + LA->length - 1; // pa 指向第一個順序表的最后一個元素ElemType *pb_last = pb + LB->length - 1; // pb 指向第二個順序表的最后一個元素while (pa <= pa_last && pb <= pb_last) // 只要兩個順序表都沒有遍歷完{if (pa->x < pb->x) // 如果第一個順序表的元素小于第二個順序表的元素*pc++ = *pa++; // 將第一個順序表的元素放入合并后的順序表else*pc++ = *pb++; // 將第二個順序表的元素放入合并后的順序表}while (pa <= pa_last) // 如果第一個順序表還有元素*pc++ = *pa++;    // 將第一個順序表的元素放入合并后的順序表while (pb <= pb_last) // 如果第二個順序表還有元素*pc++ = *pb++;    // 將第二個順序表的元素放入合并后的順序表return OK;
}

【算法分析】

第一個 while 循環執行的次數是 m + n - LA或LB表剩余未插入到LC表的元素個數 次,主要是取決于順序表中的數字情況,不管怎么樣,這個循環最終執行完畢后,一定有一個順序表的元素全部插入到 LC 表中。而后面的兩個循環就是處理另外一個順序表,將該順序表的剩余元素插入到 LC 表中,所以執行次數就是 m + n 次,時間復雜度 O(m+n),因為多用了一個 m + n 的空間,所以空間復雜度 O(m+n)

鏈表實現

【算法步驟】

  1. 指針 papb 初始化,分別指向 LALB 的第一個結點。
  2. LC 的結點取值為 LA 的頭結點。
  3. 指針 pc 初始化,指向 LC 的頭結點。
  4. 當指針 papb 均未到達相應表尾時,則依次比較 papb 所指向的元素值,從 LALB 中“摘取”元素值較小的結點插入到 LC 的最后。
  5. 將非空表的剩余段插入到 pc 所指結點之后。
  6. 釋放 LB 的頭結點。

【代碼實現】

// 合并兩個有序表:鏈表實現。
Status MergeList(LinkList *LA, LinkList *LB, LinkList *LC)
{LNode *pa = (*LA)->next; // 指向鏈表LA的第一個結點LNode *pb = (*LB)->next; // 指向鏈表LB的第一個結點LC = LA;                 // 將鏈表LA的頭結點賦值給LCLNode *pc = *LC;         // 指向合并后的鏈表的頭結點while (pa != NULL && pb != NULL) // 遍歷到鏈表LA或LB的末尾{if (pa->data.x <= pb->data.x) // 如果鏈表LA的當前結點小于等于鏈表LB的當前結點{pc->next = pa; // 將鏈表LA的當前結點添加到合并后的鏈表中pc = pa;       // 移動到下一個結點pa = pa->next; // 移動到下一個結點}else{pc->next = pb; // 將鏈表LB的當前結點添加到合并后的鏈表中pc = pb;       // 移動到下一個結點pb = pb->next; // 移動到下一個結點}}pc->next = pa != NULL ? pa : pb; // 將剩余的結點添加到合并后的鏈表中free(*LB);    // 釋放鏈表LB頭結點的內存(*LB) = NULL; // 將鏈表LB的頭結點指針置為NULLreturn OK;
}

【算法分析】

假設 LA 鏈表的長度為 m,LB 鏈表的長度為 n,m < n。分析其中的代碼,執行主體在 while 循環:

  • 最好的情況,就是小的數字全部在 LA 中,這樣循環只要執行 m 次即可。
  • 最差的情況 LA 中第一個元素是最小值,最后一個元素是最大值, 這樣 LA 和 LB 中的元素都要遍歷一遍,理論就是 m + n 次。

所以平均的時間復雜度就是 O(m+n) 。因為只需將原來兩個鏈表中結點之間的關系解除, 重新按元素值非遞減的關系將所有結點鏈接成一個鏈表即可,所以空間復雜度為 O(1)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909264.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

流數據機器學習框架 CapyMOA

環境準備: pip install capymoa 使用 HoeffdingTree 對流數據做在線分類: from capymoa.streams import FileStream from capymoa.learners import HoeffdingTreeClassifier from capymoa.evaluation import ProgressiveEvaluator# 1. 構造流&#xff1a;假設 data/stream…

QEMU源碼全解析 —— 塊設備虛擬化(27)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(26) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 Virt

Cilium動手實驗室: 精通之旅---19.Golden Signals with Hubble and Grafana

Cilium動手實驗室: 精通之旅---19.Golden Signals with Hubble and Grafana 1. Lab 環境2. 部署測試應用2.1 7層可見性的網絡2.1.1 允許所有命名空間2.1.2 DNS 可見性2.1.3 L7-egress-visibility 2.2 檢查 Deployments2.3 在 Hubble UI 中查看 3. Grafana 選項卡3.1 Grafana 中…

常見文件系統格式有哪些

PART.01 常見文件系統格式有哪些 常見的文件系統格式有很多&#xff0c;通常根據使用場景&#xff08;Windows、Linux、macOS、移動設備、U盤、硬盤等&#xff09;有所不同。以下是一些主流和常見的文件系統格式及其特點&#xff1a; 一、Windows 常見文件系統格式 Digital …

React Native 彈窗組件優化實戰:解決 Modal 閃爍與動畫卡頓問題

&#x1f4cc; 前言 在移動端開發中&#xff0c;用戶對動畫的流暢性和過渡自然性有著極高的期待。最近我對一個使用 react-native-modal 實現的 Alert 彈窗組件進行了優化&#xff0c;成功解決了閃爍和卡頓問題&#xff0c;并顯著提升了用戶體驗。 本篇博客將帶你深入了解優化…

智能客服系統開發方案:RAG+多智能體技術實現

智能客服系統開發方案:RAG+多智能體技術實現 一、系統架構設計 #mermaid-svg-hKDXil2J0xV064Q5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hKDXil2J0xV064Q5 .error-icon{fill:#552222;}#mermaid-svg-hKDXil2…

【Kafka】消息隊列Kafka知識總結

【Kafka】消息隊列Kafka知識總結 【一】消息隊列【1】什么是消息隊列【2】消息隊列有什么用&#xff08;1&#xff09;異步處理&#xff08;2&#xff09;削峰/限流&#xff08;3&#xff09;降低系統耦合性&#xff08;4&#xff09;實現分布式事務&#xff08;5&#xff09;順…

微信小程序開發 RangeError: Maximum call stack size exceeded

通常是由于??調用棧深度超限??&#xff08;如無限遞歸、過深的函數調用鏈或數據綁定循環&#xff09;導致。以下是具體解決方案&#xff1a; 一、核心原因分析 ??無限遞歸?? 函數直接或間接調用自身且無終止條件&#xff0c;例如事件處理函數中錯誤觸發自身。??數據…

mapbox進階,切片網格生成實現

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??line線圖層樣式1.4 ??symbol符號圖層…

Mysql 函數concat、concat_ws和group_concat

1.concat concat()函數是將多個字符串組合在一起&#xff0c;形成一個大的字符串&#xff1b;如果連接的字符串中存在一個為NULL&#xff0c;則輸出的結果為NULL&#xff0c;語法格式為&#xff1a; concat(str1,str2,....strn) -- 1、字符之間不加連接符 mysql> select c…

“在同一事務中“ 的含義

一、"在同一事務中" 的核心含義 "在同一事務中" 指多個數據庫操作共享同一個事務上下文&#xff0c;具有以下特點&#xff1a; 原子性保證&#xff1a;所有操作要么全部成功提交&#xff0c;要么全部失敗回滾。隔離性共享&#xff1a;操作使用相同的隔離…

【Create my OS】從零編寫一個操作系統

前言&#xff1a; 相信每個自學操作系統的同學&#xff0c;大致學習路線都離不開 HIT-OS、MIT-6.S081、MIT-6.824、MIT-6.828等經典的公開課。但學習完這些經典公開課并完成相應的Lab&#xff0c;很多同學腦海中對于操作系統的知識其實都是零散的&#xff0c;讓你從頭開始編寫一…

計算機視覺與深度學習 | 低照度圖像增強算法綜述(開源鏈接,原理,公式,代碼)

低照度圖像增強算法綜述 1 算法分類與原理1.1 傳統方法1.2 深度學習方法2 核心算法詳解2.1 多尺度Retinex (MSRCR) 實現2.2 SCI自校準光照學習2.3 自適應伽馬校正2.4 WaveletMamba架構3 開源資源與實現3.1 主流算法開源庫3.2 關鍵代碼實現4 評估與實驗對比4.1 客觀評價指標4.2 …

【工具教程】批量PDF識別提取區域的內容重命名,將PDF指定區域位置的內容提取出來改名的具體操作步驟

在企業運營過程中&#xff0c;時常會面臨處理海量 PDF 文件的挑戰。從 PDF 指定區域提取內容并用于重命名文件&#xff0c;能極大地優化企業內部的文件管理流程&#xff0c;提升工作效率。以下為您詳細介紹其在企業中的應用場景、具體使用步驟及注意事項。? 詳細使用步驟? 選…

【Java多線程從青銅到王者】定時器的原理和實現(十一)

定時器 定時器時我們日常開發中會用到的組件工具&#xff0c;類似于一個"鬧鐘"&#xff0c;設定一個時間&#xff0c;等到了時間&#xff0c;定時器最自動的去執行某個邏輯&#xff0c;比如博客的定時發布&#xff0c;就是使用到了定時器 Java標準庫里面也提供了定時…

深入剖析AI大模型:Prompt 優化的底層邏輯

記得看到一篇NLP的文章&#xff0c;就 Prompt 時序效應的論文揭示了一個有趣現象&#xff0c;文章中說&#xff1a;模型對指令的解析存在 "注意力衰減" 特性 —— 就像人類閱讀時會更關注段落開頭&#xff0c;模型對 Prompt 前 20% 的內容賦予的權重高達 60%。這個發…

【備忘】PHP web項目一般部署辦法

【PHP項目一般部署辦法】 操作步驟 代碼&#xff1a; 把php項目代碼clone到指定位置如www/下新建php站點&#xff0c;填寫域名&#xff0c;把站點根目錄設置為項目根目錄項目入口設置&#xff0c;一般為public/項目權限改為766(特殊時候可設置為777)&#xff0c;如果有特殊要求…

【60 Pandas+Pyecharts | 箱包訂單數據分析可視化】

文章目錄 &#x1f3f3;??&#x1f308; 1. 導入模塊&#x1f3f3;??&#x1f308; 2. Pandas數據處理2.1 讀取數據2.2 數據信息2.3 去除訂單金額為空的數據2.5 提取季度和星期 &#x1f3f3;??&#x1f308; 3. Pyecharts數據可視化3.1 每月訂單量和訂單金額分布3.2 各季…

玩轉Docker | 使用Docker部署vaultwarden密碼管理器

玩轉Docker | 使用Docker部署vaultwarden密碼管理器 前言一、vaultwarden介紹Vaultwarden 簡介主要特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署vaultwarden服務下載vaultwarden鏡像編輯部署文件創建容器檢查容器狀態檢查服務端口安全設置四、配置…

晶振的多面舞臺:從日常電子到高精尖科技的應用探秘

在現代科技的宏大舞臺上&#xff0c;晶振宛如一位低調卻至關重要的幕后主角&#xff0c;以其穩定的頻率輸出&#xff0c;為各類電子設備賦予了精準的“脈搏”。從我們日常生活中須臾不離的電子設備&#xff0c;到引領時代前沿的高精尖科技領域&#xff0c;晶振都發揮著不可替代…