【計算機考研(408)- 數據結構】緒論

緒論

基本概念(理解即可)

數據是信息的載體,是描述客觀事物屬性的數、字符及所有能輸入到計算機中并被計算機程序識別
和處理的符號的集合。數據是計算機程序加工的原料。(For Example : 聲音/圖像/字符串等)

數據元素是數據的基本單位,通常作為一個整體進行考慮和處理。
一個數據元素可由若干數據項組成,數據項是構成數據元素的不可分割的最小單位。(For Example : 書籍信息是一個數據元素,其中的書名/價格/作者/ISBN等信息作為一個又一個的數據項)

數據結構是相互之間存在一種或多種特定關系的數據元素的集合。
數據對象是具有相同性質的數據元素的集合,是數據的一個子集。

數據結構三要素

不難知道,數據元素之間都不是孤立存在的,一定存在某種關系,這種數據元素之間的關系我們稱之為結構。根據相關特性一般可以分為以下四種:

  • 集合
  • 線性結構
  • 樹形結構
  • 圖狀結構或網狀結構
    他們說明的是數據元素之間的邏輯關系,也叫做:邏輯結構

那么 數據結構在計算機中的表示(也稱映像),也就被稱作物理結構。它包括數據元素的表示和關系的表示。一般地,我們有以下幾種主要的物理結構:

  • 順序存儲(以物理位置相鄰表示邏輯上的相鄰)
  • 鏈式存儲(形成鏈狀)
  • 索引存儲(建立索引表)
  • 散列存儲(根據關鍵字算存儲位置)

施加在數據上的運算包括運算的定義(邏輯)和實現(物理)被稱之為數據的運算

數據類型、抽象數據類型

數據類型是一個值的集合和定義在此集合上的一組操作的總稱。
原子類型:其值不可再分的數據類型。(如bool & int)
結構類型:其值可以再分解為若干成分(分量)的數據類型。(如class等)
抽象數據類型(Abstract Data Type,ADT):抽象數據組織及與之相關的操作。

ADT用數學化的語言定義數據的邏輯結構、定義運算。與具體的實現無關。

算法和算法分析

算法

算法(Algorithm)是對特定問題求解步驟的一種描述,它是指令的有限序列,其中的每條指令表示一個或多個操作。從定義上和實際,他應具備如下五種特性:

  • 有窮性。一個算法必須總在執行有窮步之后結束,且每一步都可在有窮時間內完成。
  • 確定性。算法中每條指令必須有確切的含義,對于相同的輸入只能得出相同的輸出。
  • 可行性。算法中描述的操作都可以通過已經實現的基本運算執行有限次來實現。
  • 輸入。一個算法有零個或多個輸入,這些輸入取自于某個特定的對象的集合。
  • 輸出。一個算法有一個或多個輸出,這些輸出是與輸入有著某種特定關系的量。

對于一個”好“算法一定要達到以下目標:

  • 正確性。算法應能夠正確地解決求解問題。
  • 可讀性。算法應具有良好的可讀性,以幫助人們理解
  • 健壯性。輸入非法數據時,算法能適當地做出反應或進行處理,而不會產生莫名其妙的輸出結果。
  • 高效率(時間復雜度低)與低存儲量需求(空間復雜度低)

算法效率的度量

時間復雜度

一個語句的頻度是指改語句在算法中被重復執行的次數。算法中所有語句的頻度之和被記為T(n)T(n)T(n)。他是關于該算法問題規模n的函數,時間復雜度主要分析T(n)T(n)T(n)的數量級。算法中基本運算(最深層的語句)的頻度與T(n)T(n)T(n)同數量級每一次通常將算法中基本運算的執行次數的數量級作為該算法的時間復雜度。于是時間復雜度可以定義為:

T(n)=O(f(n))T(n) = O(f(n))T(n)=O(f(n))

當然,最終我們寫出的時間復雜度應取隨n增長最快的項,將其系數置為1作為時間復雜度的度量,例如f(n)=3n2+2n+1f(n) = 3n^2 + 2n + 1f(n)=3n2+2n+1,則T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2)

在分析時間復雜度的時候,有以下兩條規則:

  • 加法規則:T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max?(f(n),g(n)))T(n) = T_1(n) + T_2(n) = O(f(n)) + O(g(n)) = O(\max(f(n), g(n)))T(n)=T1?(n)+T2?(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
  • 乘法規則:T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))T(n) = T_1(n) \times T_2(n) = O(f(n)) \times O(g(n)) = O(f(n) \times g(n))T(n)=T1?(n)×T2?(n)=O(f(n))×O(g(n))=O(f(n)×g(n))

常見的漸進時間復雜度有:

O(1)<O(log?2n)<O(n)<O(nlog?2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1) < O(\log_2 n) < O(n) < O(n \log_2 n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n) O(1)<O(log2?n)<O(n)<O(nlog2?n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

圖像表示:

1

相應的我們還有如下定義:

最壞時間復雜度:最壞情況下算法的時間復雜度
平均時間復雜度:所有輸入示例等概率出現的情況下,算法的期望運行時間
最好時間復雜度:最好情況下算法的時間復雜度

空間復雜度

算法的空間復雜度S(n)S(n)S(n)定義為該算法所需的存儲空間,他是一個關于算法問題規模n的函數。記為:

S(n)=O(f(n))S(n) = O(f(n))S(n)=O(f(n))

他的計算方法與時間復雜度類似,主要分析算法中基本存儲單元的使用情況。空間復雜度的計算也有加法和乘法規則。(不在贅述在此)

一個程序在執行時除了需要存儲空間來存放自身所用的指令、常數、變量和輸入數據外,還需要一些對數據進行操作的工作單元和存儲一些為實現計算所需信息的輔助空間。若輸入數據所占空間只取決于問題本身,和算法無關,則只需要分析除輸入和程序之外的額外空間。如果算法原地工作是指算法所需的輔助空間為常量,即S(n)=O(1)S(n) = O(1)S(n)=O(1)

也就是說:空間復雜度為O(1)O(1)O(1)代表算法所需輔助空間的大小與問題規模無關。

舉例:

void test(int n){int a[n];int i;
}

上面代碼中,數組a的大小與n有關,因此空間復雜度為O(n)O(n)O(n)

void test(int n){int i;
}

上面代碼中,變量i的大小與n無關,因此空間復雜度為O(1)O(1)O(1)

void test(int n){int a[n][n];
}

上面代碼中,數組a的大小與n有關,因此空間復雜度為O(n2)O(n^2)O(n2)

void test(int n){int a[n];int b[n][n];int i;
}

上面代碼中,數組a的大小與n有關,數組b的大小與n有關,因此空間復雜度為S(n)=O(n2)+O(n)+O(1)S(n) = O(n^2)+O(n)+O(1)S(n)=O(n2)+O(n)+O(1),根據加法原則:S(n)=O(n2)S(n)=O(n^2)S(n)=O(n2)

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

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

相關文章

嵌入式學習-土堆PyTorch(9)-day25

進入尾聲&#xff0c;一個完整的模型訓練 &#xff0c;點亮的第一個led#自己注釋版 import torch import torchvision.datasets from torch import nn from torch.utils.tensorboard import SummaryWriter import time # from model import * from torch.utils.data import Dat…

Java變量詳解:局部變量、成員變量、類變量區別及使用場景

作為Java開發者&#xff0c;深入理解不同變量的特性是寫出高質量代碼的基礎。本文將為你全面解析三種核心變量類型&#xff0c;并通過實戰案例展示它們的正確使用方式。一、變量類型概覽 1. 局部變量&#xff08;Local Variable&#xff09; 定義&#xff1a;在方法、構造方法或…

【收集電腦信息】collect_info.sh

收集電腦信息 collect_info.sh #!/bin/bashoutput"info.txt" > "$output"# 1. OS Version echo " 操作系統名稱及版本 " >> "$output" lsb_release -d | cut -f2- >> "$output" echo -e "\n" >…

服務器清理空間--主要是conda環境清理和刪除

1.查看空間情況 (base) zhouy24RL-DSlab:~/zhouy24Files$ df -h Filesystem Size Used Avail Use% Mounted on udev 252G 0 252G 0% /dev tmpfs 51G 4.9M 51G 1% /run /dev/nvme0n1p3 1.9T 1.7T 42G 98% / tmpfs 252G …

UE5多人MOBA+GAS 26、為角色添加每秒回血回藍(番外:添加到UI上)

文章目錄添加生命值和藍量的狀態標簽創建無限GE并應用監聽添加和去除標簽每秒回復配上UI添加生命值和藍量的狀態標簽 添加新的標簽 CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Health_Full)CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Health_Empty)CRUNCH_API U…

MetaGPT源碼剖析(三):多智能體系統的 “智能角色“ 核心實現——Role類

每一篇文章都短小精悍&#xff0c;不啰嗦。今天我們來深入剖析Role類的代碼實現。在多智能體協作系統中&#xff0c;Role&#xff08;角色&#xff09;就像現實世界中的 "員工"&#xff0c;是執行具體任務、參與協作的基本單位。這段代碼是 MetaGPT 框架的核心&#…

【項目經驗】小智ai MCP學習筆記

理論 1、什么是MCP MCP(Model Context Protocol&#xff0c;模型上下文協議)是一種開放式協議&#xff0c;它實現了LLM與各種工具的調用。使LLM從對話、生成式AI變成了擁有調用三方工具的AI。用官方的比喻&#xff0c;MCP就是USB-C接口&#xff0c;只要實現了這個接口&#x…

Matlab學習筆記:矩陣基礎

MATLAB學習筆記:矩陣基礎 作為MATLAB的核心,矩陣是處理數據的基礎工具。矩陣本質上是一個二維數組,由行和列組成,用于存儲和操作數值數據。在本節中,我將詳細講解矩陣的所有知識點,包括創建、索引、運算、函數等,確保內容通俗易懂。我會在關鍵地方添加MATLAB代碼示例,…

技術演進中的開發沉思-38 MFC系列:關于打印

打印程序也是MFC開發中不能忽視的一個環節&#xff0c;現在做打印開發so easy。但當年做打印開發還是挺麻煩。在當年的桌面程序里就像拼圖的最后一塊&#xff0c;看著簡單&#xff0c;實則要把屏幕上的像素世界&#xff0c;準確映射到打印機的物理紙張上。而MFC 的打印機制就像…

Apache Ignite 長事務終止機制

這段內容講的是 Apache Ignite 中長事務終止機制&#xff08;Long Running Transactions Termination&#xff09;&#xff0c;特別是關于分區映射交換&#xff08;Partition Map Exchange&#xff09;與事務超時設置&#xff08;Transaction Timeout&#xff09;之間的關系。下…

網絡編程---TCP協議

TCP協議基礎知識TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;是互聯網核心協議之一&#xff0c;位于傳輸層&#xff08;OSI第4層&#xff09;&#xff0c;為應用層提供可靠的、面向連接的、基于字節流的數據傳輸服務。它與IP協議共同構成…

K 近鄰算法(K-Nearest Neighbors, KNN)詳解及案例

K近鄰算法&#xff08;K-Nearest Neighbors, KNN&#xff09;詳解及案例 一、基本原理 K近鄰算法是一種監督學習算法&#xff0c;核心思想是“物以類聚&#xff0c;人以群分”&#xff1a;對于一個新樣本&#xff0c;通過計算它與訓練集中所有樣本的“距離”&#xff0c;找出距…

深入理解 Redis 集群化看門狗機制:原理、實踐與風險

在分布式系統中&#xff0c;我們常常需要執行一些關鍵任務&#xff0c;這些任務要么必須成功執行&#xff0c;要么失敗后需要明確的狀態&#xff08;如回滾&#xff09;&#xff0c;并且它們的執行時間可能難以精確預測。如何確保這些任務不會被意外中斷&#xff0c;或者在長時…

Python機器學習:從零基礎到項目實戰

目錄第一部分&#xff1a;思想與基石——萬法歸宗&#xff0c;筑基問道第1章&#xff1a;初探智慧之境——機器學習世界觀1.1 何為學習&#xff1f;從人類學習到機器智能1.2 機器學習的“前世今生”&#xff1a;一部思想與技術的演進史1.3 為何是Python&#xff1f;——數據科學…

數據庫:庫的操作

1&#xff1a;查看所有數據庫SHOW DATABASES;2&#xff1a;創建數據庫CREATE DATABASE [ IF NOT EXISTS ] 數據庫名 [ CHARACTER SET 字符集編碼 | COLLATE 字符集校驗規則 | ENCRYPTION { Y | N } ];[]&#xff1a;可寫可不寫{}&#xff1a;必選一個|&#xff1a;n 選 1ENCR…

AngularJS 動畫

AngularJS 動畫 引言 AngularJS 是一個流行的JavaScript框架,它為開發者提供了一種構建動態Web應用的方式。在AngularJS中,動畫是一個強大的功能,可以幫助我們創建出更加生動和引人注目的用戶界面。本文將詳細介紹AngularJS動畫的原理、用法以及最佳實踐。 AngularJS 動畫…

SonarQube 代碼分析工具

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 ??全面掌握 SonarQube:企業代碼質量保障的利器 ?? 在當今 DevOps 流水線中,代碼…

vmware vsphere esxi6.5 使用工具導出鏡像

注&#xff1a;為什么使用這個工具&#xff0c;我這邊主要因為esxi6.5自身bug導致web導出鏡像會失敗一、下載VMware-ovftool到本地系統&#xff08;根據你的操作系統版本到官網下載安裝&#xff0c;此處略&#xff09;以下內容默認將VMware-ovftool安裝到windows 本地系統為例。…

ES 踩坑記:Set Processor 字段更新引發的 _source 污染

問題背景 社區的一個伙伴想對一個 integer 的字段類型添加一個 keyword 類型的子字段&#xff0c;然后進行精確匹配的查詢優化&#xff0c;提高查詢的速度。 整個索引數據量不大&#xff0c;并不想進行 reindex 這樣的復雜操作&#xff0c;就想到了使用 update_by_query 的存量…

如何徹底搞定 PyCharm 中 pip install 報錯 ModuleNotFoundError: No module named ‘requests’ 的問題

如何徹底搞定 PyCharm 中 pip install 報錯 ModuleNotFoundError: No module named ‘requests’ 的問題 在使用 PyCharm 開發 Python 項目時&#xff0c;ModuleNotFoundError: No module named requests 是一個常見但令人頭疼的問題。本篇博文將從環境配置、原因分析到多種解…