Day36-【13003】短文,數組的行主序方式,矩陣的壓縮存儲,對稱、三角、稀疏矩陣和三元組線性表,廣義表求長度、深度、表頭、表尾等

文章目錄

  • 本次課程內容
  • 第四章 數組、廣義表和串
    • 第一節 數組及廣義表
      • 數組的基本操作
      • 數組的順序存儲方式-借用矩陣行列式概念
        • 二維數組C語言對應的函數-通常行主序方式
      • 矩陣的壓縮存儲
        • 對稱矩陣和三角矩陣
        • 壓縮存儲后,采用不同的映射函數
        • 稀疏矩陣-可以構成三元組線性表
          • 三元組在C語言中的實現
          • 三元組表的轉置
            • 三元組轉置的算法實現
      • 數組的應用-解決迷宮問題
      • 廣義表
        • 廣義表示例
        • 廣義表操作示例

本次課程內容

在這里插入圖片描述

第四章 數組、廣義表和串

在這里插入圖片描述

第一節 數組及廣義表

在這里插入圖片描述

數組的基本操作

數組是高級程序設計語言中的重要語法成分,很多語言都定義了數組類型。例如,在C語言中,定義了一維數組。數組元素還可以是數組,由此得到數組的數組,

即多維數組。

一般將n(n>2)維數組看作n-1維數組的數組。

從數據結構的角度來理解,一維數組可以作為線性表的存儲結構,數組中保存的各元素可以組成一個線性表。多維數組在系統內部都對應一個隱含的一維數組,所

以多維數組也是一種線性表。例如,二維數組就是以一維數組為元素的線性表。

數組的每個元素都是形如(index,value)的二元對,index是數組下標,也稱為索引,value是對應于該下標的數值。任何兩個元素的index值都不相同。

從數組的操作可知,它沒有一般線性表常用的插入和刪除操作,更多的是根據下標index訪問元素。

數組的順序存儲方式-借用矩陣行列式概念

一維數組天然地采用順序存儲方式,

多維數組的順序存儲又是什么樣的呢?

數組的順序存儲有兩種形式。以二維數組為例,它的元素可以按行排列,也可以按列排列。

這里的“行”和“列”借用數學上矩陣或行列式中的概念。

所謂按行排列,就是先排數組的第一行,緊隨其后排第二行,依此類推。

所謂按列排列,就是先排數組的第一列,緊隨其后排第二列,依此類推。

最終都是將數組中的全部元素排列成一個序列。

在C語言中,可以定義多維數組,它的下標采取如下的形式表示:

在這里插入圖片描述

二維數組C語言對應的函數-通常行主序方式

在這里插入圖片描述

通常int類型占4字節,數組D2Array中含有18個元素,共占用18x4=72字節。如果保存的起始地址是1000,則數組將占用從1000到1071的內存空間。注意,這里

提到的字節編號并不是內存中真實的編號。將圖4-1所示的下標表格按行自上而下、同一行中自左至右的次序進行連續編號,從0開始,

即可得到圖4-2a所示的編號結果,

這種按行優先把二維數組中的下標映射到0~n-1之間的某個整數的方式稱為按行優先方式,也稱為行主序方式

包括C語言在內的大多數程序設計語言均采用行主序的實現模式。

也有一些程序設計語言采用另一種實現模式,稱為按列優先方式,也稱為列主序方式。

在列主序方式中,按列優先,對于下標表格,從第一列開始,從上到下進行連續編號,直到最后一列。這個結果如圖4-2b所示。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

矩陣的壓縮存儲

數學中的矩陣可以使用二維數組保存。對于n行m列的矩陣,數組元素至少需要分配n x m個。

有些矩陣因其特殊性,可以不必保存其中的所有元素,因而可以減少為數組分配的空間

對稱矩陣和三角矩陣

在這里插入圖片描述
在這里插入圖片描述

如果不考慮矩陣的特殊性,按照一般二維數組的順序存儲方式來存儲特殊矩陣,也是完全可行的。

但是,從節省存儲空間的角度考慮,對稱矩陣和上(下)三角矩陣都可以只保存矩陣中約一半的元素,從而可以節省差不多一半的存儲空間。

這樣的存儲形式稱為壓縮存儲。

  • 具體來說,對干對稱矩陣,因為對角線以上及以下的元素對稱相等,所以只需要保存其中的一半及對角線上的元素

  • 對于上三角矩陣或下三角矩陣,僅保存上三角部分或下三角部分的元素,另外一半的0元素不再保存。

若矩陣有n行n列,則這三種形式下需要保存的元素個數為nx(n+1)/2。

在采用壓縮存儲以后,需要尋找與普通二維數組不同的映射函數。

壓縮存儲后,采用不同的映射函數

在這里插入圖片描述

在這里插入圖片描述

稀疏矩陣-可以構成三元組線性表

在實際的應用中,矩陣中可能會出現大量的0元素,而非0元素數量很少,這就是所謂的稀疏矩陣。至于非0元素少到什么程度才能稱為稀疏矩陣,并沒有很嚴格的定義。通常認為,矩陣中非0元素的個數與矩陣的階數相當,即可將其看作稀疏矩陣

  • 如何理解?

為了節省空間,一般只存儲稀疏矩陣中的非0元素。但在稀疏矩陣中,非0元素的出現是沒有規律的,

所以在存儲非0元素時必須將它所在的行號和列號一起存儲起來。這些信息組成一個三元組(i,j,v)的形式

其中v表示非0元素的值,i表示v所在的行號,i表示v所在的列號。

一個稀疏矩陣的所有元素用一個三元組表來表示,也就是可以構成一個三元組的線性表

在這里插入圖片描述

為了方便后續其他操作的實現,三元組表應該是一個有序序列,通常按行主序的次序排列,即先按行的大小排列,同一行的三元組再按列的大小排列。

三元組表的初始值從鍵盤輸入,輸入時,各三元組可以按行主序排列,也可以按任意的次序排列,但最終都應該按行主序的次序插入到一維數組的合適位置。

當然,在有特殊需求的應用中,也可以按列主序方式保存。

三元組在C語言中的實現

在這里插入圖片描述

在這里插入圖片描述

三元組表的轉置

轉置是矩陣中常用的一種操作。下面實現采用三元組表表示的稀疏矩陣的轉置算法。矩陣轉置即行、列互換,i行的元素放置到i列,這也意味著,j列的元素放置在j行。如果矩陣是nxm則轉置后得到的矩陣是mxn的。
很容易想到,將三元組表中的每個三元組項的i與i互換,即可得到轉置后矩陣的三元組表。但是,這樣轉換后得到的三元組表不再按行主序排列,不便于后續操作的實現。所以,要實現矩陣轉置程序,必須先得到一個按行主序排列的三元組表。

可以像readSparseMatrix函數那樣處理,讀入原矩陣的一個三元組,插入到目標矩陣的三元組表中。在插入過程中,需要調整部分三元組在三元組表中的次序,也就是需要進行元素的移動。從順序表實現的時間復雜度分析中知道,這樣的移動會導致轉置操作的效率很低。
可以使用一個臨時計數數組,記錄原矩陣的每個三元組在目標矩陣的三元組表中的插入位置,以輔助完成轉置操作,由此避免了三元組的移動,可高效率地實現轉置操作。
不失一般性,設原矩陣A的行數是rows,列數是cols,則轉置后矩陣B的行數是cols,列數是rows。元組的個數沒有改變。

在這里插入圖片描述

三元組轉置的算法實現

在這里插入圖片描述

數組的應用-解決迷宮問題

多維數組,特別是二維數組,在計算機科學中有廣泛的應用。

下面以一個有趣的“迷宮”問題為例,介紹數組的應用。

“老鼠走迷宮”是實驗心理學中的一個經典問題,也是一種智力游戲。

在計算機模擬實現中,可以用-個較大的二維數組表示迷宮,其中元素0表示走得通,元素1表示走不通(受阻),行走路徑只考慮水平和垂直方向上的4個方向(上、下、左、右)。圖4-9是一個迷宮示意圖。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

  • 適合解決復雜迷宮問題,簡單的用算法不至于

廣義表

廣義表是線性表的推廣,也稱為列表

它是由n(n≥0)個表元素組成的有限序列,記為:
在這里插入圖片描述

在這里插入圖片描述

廣義表示例

在這里插入圖片描述

廣義表操作示例

在這里插入圖片描述

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

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

相關文章

Android原生開發入門

1. 資源地址 Android官方教程Android參考手冊 2. 必看基礎模塊 應用基礎知識View 綁定 :綁定相當于Qt中的ui文件生成界面代碼的機制,Qt中的ucc會自動將ui文件編譯成ui_xxxx.h文件,Android開發中也一樣。 Android中自動生成的代碼在&#x…

3-Not_only_base/2018網鼎杯

3-Not_only_base 打開code MCJIJSGKPZZYXZXRMUW3YZG3ZZG3HQHCUS 分析: 首先看題知道解密過程中肯定有base解密。 知識點1: Base64字符集: 包含大小寫字母(A-Z、a-z)、數字(0-9)以及兩個特殊字…

deepseek、qwen等多種模型本地化部署

想要在本地部署deepseek、qwen等模型其實很簡單,快跟著小編一起部署吧 1 環境搭建 1.1下載安裝環境 首先我們需要搭建一個環境ollama,下載地址如下 :Ollama 點擊Download 根據自己電腦的系統選擇對應版本下載即可 1.2 安裝環境(window為例) 可以直接點擊安裝包進行安…

02/06 軟件設計模式

目錄 一.創建型模式 抽象工廠 Abstract Factory 構建器 Builder 工廠方法 Factory Method 原型 Prototype 單例模式 Singleton 二.結構型模式 適配器模式 Adapter 橋接模式 Bridge 組合模式 Composite 裝飾者模式 Decorator 外觀模式 Facade 享元模式 Flyw…

Idea ? Maven 選項

Idea ? Maven 選項 1. 在 Idea 項?上右鍵2. 選中 Maven 選項 如果在創建 Spring/Spring Boot 項?時,Idea 右側沒有 Maven 選項,如下圖所示: 此時可以使?以下?式解決。 1. 在 Idea 項?上右鍵 2. 選中 Maven 選項 選中 Maven 之后&#…

企業百科和品牌百科創建技巧

很多人比較困惑,創建百科詞條需要注意哪些事情?為什么參考提交了權威新聞參考資料還是沒有通過,下面小馬識途營銷顧問就為大家解答疑惑: 1、品牌詞以及企業詞提交 1)如果沒有詞條,我們可以通過平臺提供的急…

用Deepseek做EXCLE文件對比

背景是我想對比兩個PO系統里的一個消息映射,EDI接口的mapping有多復雜懂的都懂,它還不支持跨系統版本對比,所以我費半天勁裝NWDS,導出MM到excle,然后問題來了,我需要對比兩個excel文件里的內容,…

Agent開發注意事項

這里寫自定義目錄標題 llm應用開發什么是Agent?Agent1:工作流Agent2:自主AgentLLM如何擁有自主規劃能力? Tool 參考: llm應用開發 llm工程師需要具備以下能力: [] 軟件工程技能:將各個組件組裝在一起 [] 算法能力&am…

OpenCV:圖像輪廓

目錄 簡述 1. 什么是圖像輪廓? 2. 查找圖像輪廓 2.1 接口定義 2.2 參數說明 2.3 代碼示例 2.4 運行結果 3. 繪制圖像輪廓 3.1 接口定義 3.2 參數說明 3.3 代碼示例 3.4 運行結果 4. 計算輪廓周長 5. 計算輪廓面積 6. 示例:計算圖像輪廓的面…

在Mac mini M4上部署DeepSeek R1本地大模型

在Mac mini M4上部署DeepSeek R1本地大模型 安裝ollama 本地部署,我們可以通過Ollama來進行安裝 Ollama 官方版:【點擊前往】 Web UI 控制端【點擊安裝】 如何在MacOS上更換Ollama的模型位置 默認安裝時,OLLAMA_MODELS 位置在"~/.o…

CVPR | CNN融合注意力機制,蕪湖起飛!

**標題:**On the Integration of Self-Attention and Convolution **論文鏈接:**https://arxiv.org/pdf/2111.14556 **代碼鏈接:**https://github.com/LeapLabTHU/ACmix 創新點 1. 揭示卷積和自注意力的內在聯系 文章通過重新分解卷積和自…

module ‘matplotlib.cm‘ has no attribute ‘get_cmap‘

目錄 解決方法1: 解決方法2,新版api改了: module matplotlib.cm has no attribute get_cmap 報錯代碼: cmap matplotlib.cm.get_cmap(Oranges) 解決方法1: pip install matplotlib3.7.3 解決方法2,新版…

使用Nuxt.js實現服務端渲染(SSR):提升SEO與性能的完整指南

使用Nuxt.js實現服務端渲染(SSR):提升SEO與性能的完整指南 使用Nuxt.js實現服務端渲染(SSR):提升SEO與性能的完整指南1. 服務端渲染(SSR)核心概念1.1 CSR vs SSR vs SSG1.2 SSR工作原…

解釋 Java 中的反射機制和動態代理的原理?

反射機制是Java語言的一個特性,它允許程序在運行時檢查和操作類、方法、字段等。 通過反射,我們可以在運行時獲取類的信息,創建對象,調用方法和訪問字段,即使這些信息在編譯時是未知的。 反射的基本用法 import jav…

http狀態碼:504 Gateway Timeout(網關超時)的原有以及排查問題的思路

504 Gateway Timeout(網關超時) 是一種常見的HTTP錯誤狀態碼,表示服務器作為網關或代理時,未能及時從上游服務器收到響應。以下是它的原因和排查問題的思路: 1. 504錯誤的含義 定義:服務器作為網關或代理時…

Linux 安裝 RabbitMQ

Linux下安裝RabbitMQ 1 、獲取安裝包 # 地址 https://github.com/rabbitmq/erlang-rpm/releases/download/v21.3.8.9/erlang-21.3.8.9-1.el7.x86_64.rpm erlang-21.3.8.9-1.el7.x86_64.rpmsocat-1.7.3.2-1.el6.lux.x86_64.rpm# 地址 https://github.com/rabbitmq/rabbitmq-se…

LOCAL_PREBUILT_JNI_LIBS使用說明

LOCAL_PREBUILT_JNI_LIBS使用說明 使用LOCAL_PREBUILT_JNI_LIBS,可用于控制APK集成時,其相關so的集成方式。 比如,用于將APK中的so,抽取出來。 LOCAL_PREBUILT_JNI_LIBS : \lib/arm64-v8a/libNativeCore.so \lib/arm64-v8a/liba…

Java中的object類

1.Object類是什么? 🟪Object 是 Java 類庫中的一個特殊類,也是所有類的父類(超類),位于類繼承層次結構的頂端。也就是說,Java 允許把任何類型的對象賦給 Object 類型的變量。 🟦Java里面除了Object類,所有的…

uniapp小程序自定義中間凸起樣式底部tabbar

我自己寫的自定義的tabbar效果圖 廢話少說咱們直接上代碼,一步一步來 第一步: 找到根目錄下的 pages.json 文件,在 tabBar 中把 custom 設置為 true,默認值是 false。list 中設置自定義的相關信息, pagePath&#x…

四、GPIO中斷實現按鍵功能

4.1 GPIO簡介 輸入輸出(I/O)是一個非常重要的概念。I/O泛指所有類型的輸入輸出端口,包括單向的端口如邏輯門電路的輸入輸出管腳和雙向的GPIO端口。而GPIO(General-Purpose Input/Output)則是一個常見的術語&#xff0c…