數據結構1 ——數據結構的基本概念+一點點算法

數據結構+算法=程序設計

什么是數據結構

數據(data):符號集合,處理對象。

數據元素(data element),由數據項(data item) 組成。

關鍵字(key)識別元素,主關鍵字(primary key) 唯一識別元素。

數據結構(data structure)指數據元素之間存在的關系。

包含以下三方面: 數據的邏輯結構 數據的存儲結構 數據操作

數據的邏輯結構

線性結構:數據元素只有一個前驅數據元素和一個后繼數據元素。

樹結構:每個數據元素只有一個前驅數據元素,可有零個或若干個后繼數據元素。

圖結構:每個數據元素可有零個或若干個前驅數據元素,零個或若干個后繼數據元素。

?數據的存儲結構

?順序存儲結構

鏈式存儲結構

?

數據操作

1.初始化。

2.判斷是否空狀態。

3.存取,指獲得、設置指定元素值。

4.統計數據元素個數。

5.遍歷(traverse),指按照某種次序訪問一個數據結構中的所有元素,并且每個數據元素只被訪問一次。遍歷一種數據結構,將得到一個所有數據元素的線性序列。

6.插入(insert)、刪除(remove)指定元素。

7.查找(search),指在數據結構中尋找滿足給定條件的數據元素。

8.排序(sort),指對數據元素按照指定關鍵字值的大小遞增(或遞減)次序重新排列。

數據類型與抽象數據類型?

?數據類型(data type)是指一個類型和定義在這個類型上的操作集合。

抽象數據類型(Abstract Data Type,ADT)是指一個邏輯概念上的類型和這個類型上的操作集合。

即,一種數據結構的抽象數據類型包括:

  • 數據的邏輯結構
  • 數據操作

?#復數抽象類型

ADT Complex

{ ? ?

double real, imag; ? ? ? ? ? ? //實部和虛部 ? ?

Complex(double real, double imag) ? ?

Complex add(Complex c) ? ? ? ?//加法 ? ?

Complex sub(Complex c) ? ? ? ?//減法

}

#集合的表示與實現

ADT Set<T> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //集合抽象數據類型

{ ? ?

數據:集合中的數據元素,數據元素的數據類型為T ? ?

操作: ? ?

boolean isEmpty(); ? ? ? ? ? //判斷集合是否為空 ? ?

int size (); ? ? ? ? ? ? ? ? ? ? ? ? ?//返回元素個數 ? ?

T search(T key) ? ? ? ? ? ? ? ? //返回查找到的關鍵字為key元素 ? ?

boolean contains(T key) ?//判斷是否包含關鍵字為key元素 ? ?

boolean add(T x) ? ? ? ? ? ? ?//增加元素x ? ?

T remove(T key) ? ? ? ? ? ? ? //刪除關鍵字為key元素 ? ?

void clear() ? ? ? ? ? ? ? ? ? ? ? ?//刪除所有元素 ? ?

String toString() ? ? ? ? ? ? ? //返回所有元素的描述字符串

#集合的抽象數據類型

?ADT Set<T> { ? ?

boolean equals(Object obj) ? //比較this與obj是否相等 ? ?

Object[] toArray() ? ? ? ? ? ? ? ? //返回包含所有元素的數組 ? ?

//以下方法描述集合運算,參數是另一個集合 ? ?

boolean containsAll(Set<?> set) ? ? ? ? ?//判斷是否子集 ? ?

boolean addAll(Set<? extends T> set) //集合并運算 ? ?

boolean removeAll(Set<?> set) ? ? ? ? ? ? //集合差 ? ?

boolean retainAll(Set<?> set) ? ? ? ? ? ? ? ?//僅保留那些也包含在set的元素,集合差

}

實現不同特性的集合?

線性表表示可重復的無序集合,元素間具有前驅、后繼次序關系;不同元素的關鍵字可重復,采用序號能夠識別關鍵字重復的數據元素。

排序線性表表示可重復的排序集合,元素按關鍵字大小次序排序。

散列表表示不可重復的無序集合,元素關鍵字不重復,元素間沒有次序,不排序。

二叉排序樹表示不可重復的排序集合,元素關鍵字不重復,元素按關鍵字升/降序排序。

?用java語言的接口描述抽象數據類型

?Java語言的接口(interface)是一組抽象方法、常量和內嵌類型的集合。

1.聲明接口

public interface Set<T> ?? ?//集合接口,T是泛型參數

2.聲明實現接口的類

public abstract class AbstractSet<T> implements Set<T> ? ? //抽象集合類,沒有實現所有抽象方法 public class HashSet<T> implements Set<T> ? ?//散列表類

3.接口是引用類型

Set<T> set = new HashSet<T>(); ?//接口對象引用實例

set.add(x) //運行時多態性,執行HashSet<T>類實現的add(x)方法

算法?

?一個算法(Algorithm)是一個有窮規則的集合,其規則確定一個解決某一特定類型問題的操作序列。

定義

  • 有窮性
  • 確定性
  • 輸入
  • 輸出
  • 可行性

?算法設計目標

  • ?正確性
  • 可讀性
  • 健壯性
  • 高時間效率
  • 高空間效率

?算法描述

?//在當前數據結構中,順序查找與key相等的元素(數據類型為T);key提供查找條件的關鍵字

元素 search(T key) { ? ?

for (elem : 數據結構中的每個元素) ? //遍歷 ? ? ? ? ?

????????if (key與elem元素相等) ? ? ? ? ? ??? ?//由T類型約定兩個元素相等的比較規則

? ? ? ? ? ? ? ?查找成功,返回元素或元素位置;

查找不成功,返回查找不成功標記;

}

?算法與數據結構

?

?

?算法分析

?1.度量算法的時間效率

???????? 算法的時間效率指算法的執行時間隨問題規模的增長而增長的趨勢,通常采用時間復雜度來度量算法的時間效率。

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

1.一條簡單語句的時間復雜度是O(1)。

int count=0;

2.一個循環的時間復雜度是O(n)。

int n=8, count=0;

for (int i=1; i<=n; i++)

? ? count++; ? ? ? ? ? ? ? ? ? ?? ? ? ? ? //循環體執行n次

3.以下循環語句的時間復雜度是O(log_2 n)。

for (int i=1; i<=n; i*=2) ? ? ? ?//i按2的冪(1,2,4,8)遞增

? ? count++; ? ? ? ? ? ? ? ? ??? ? ? ? //循環體執行1+log2 n ?次

4.以下二重循環的時間復雜度為O(n^2)。

for (int i=1; i<=n; i++)

? ? for (int j=1; j<=n; j++)

5.以下二重循環的時間復雜度是O(n×log_2 n)

?for (int i=1; i<=n; i*=2) ? ? ? ?//循環log2n次

? ? ? for (int j=1; j<=n; j++) ? ? //循環n次

6.以下二重循環的時間復雜度是O(n)。

for (int i=1; i<=n; i*=2) ? ? ? ?//循環log2n次

? ? for (int j=1; j<=i; j++) ? ? ?//循環i次

? ? //循環次數

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

2.度量算法的空間效率

????????空間復雜度指算法在執行時為解決問題所需要的額外內存空間,不包括輸入數據所占用的存儲空間。

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

結論:判斷一個算法的效率時,函數中的常數和其他次要項可以忽略,而更應該關注主項(最高項)的階數

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

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

相關文章

每日八股文7.1

每日八股-7.1 網絡1.能說說 TCP 報文頭部都包含哪些關鍵字段嗎&#xff1f;2.TCP 是如何確保數據傳輸的可靠性的&#xff1f;你能詳細談談嗎&#xff1f;3.你能解釋一下 TCP 滑動窗口是如何設計的&#xff1f;它主要解決了什么問題&#xff1f;4.TCP 協議的擁塞控制是如何實現的…

高性能 List 轉 Map 解決方案(10,000 元素)

文章目錄 前言一、問題背景&#xff1a;為什么List轉Map如此重要&#xff1f;二、基礎方法對比&#xff1a;Stream vs For循環三、性能優化關鍵點四、面試回答技巧 前言 遇到一個有意思的面試題&#xff0c;如標題所說&#xff0c;當10,000條數據的List需要轉Map&#xff0c;如…

今日行情明日機會——20250701

上證指數縮量收陽線&#xff0c;形成日線上漲中繼&#xff0c;個股上漲和下跌總體持平。 深證指數量能持續放大&#xff0c;即將回補缺口位&#xff0c;短線注意周三或周四的調整。 2025年7月1日漲停股主要行業方向分析 1. 芯片&#xff08;17家漲停&#xff0c;國產替代&…

P1312 [NOIP 2011 提高組] Mayan 游戲

題目描述 Mayan puzzle 是最近流行起來的一個游戲。游戲界面是一個 7 7 7 行 5 \times5 5 列的棋盤&#xff0c;上面堆放著一些方塊&#xff0c;方塊不能懸空堆放&#xff0c;即方塊必須放在最下面一行&#xff0c;或者放在其他方塊之上。游戲通關是指在規定的步數內消除所有…

Spring Boot 2 多模塊項目中配置文件的加載順序

Spring Boot 2 多模塊項目中配置文件的加載順序 在 Spring Boot 2 多模塊項目中&#xff0c;配置文件的加載遵循特定的順序規則。了解這些規則對于正確管理多模塊應用的配置至關重要。 一、默認配置文件加載順序 Spring Boot 會按照以下順序加載 application.properties 或 …

邊界的藝術:支持向量機與統計學習時代的王者

當揚勒丘恩的卷積神經網絡LeNet在90年代初于手寫數字識別領域綻放光芒&#xff0c;卻因計算與數據的桎梏未能點燃更廣泛的燎原之火時&#xff0c;人工智能&#xff0c;特別是其子領域機器學習&#xff0c;正步入一個理論深化與方法論多元化的關鍵時期。經歷了符號主義通用智能探…

js filter()

listType(queryParams.value).then(response > {filterTable.value response.rows.slice(1); // 只顯示前3條數據;filterTable.value filterTable.value.filter(item > {return wnSensorsList.value.some(sensorsgroup > {return sensorsgroup.sensorType item.cod…

Python 庫 包 nltk (Natural Language Toolkit)

文章目錄 &#x1f9f0; 一、nltk 的主要功能? 文本處理功能? 內置語料庫&#xff08;Corpora&#xff09; &#x1f4e6; 二、安裝與使用1. 安裝 nltk2. 下載語料庫&#xff08;第一次使用時需要下載&#xff09; &#x1f50d; 三、常用功能示例示例 1&#xff1a;分詞示例…

設計模式之房產中介——代理模式

手撕設計模式之房產中介——代理模式 1.業務需求 ? 大家好&#xff0c;我是菠菜啊&#xff0c;好久不見&#xff0c;今天給大家帶來的是——代理模式。老規矩&#xff0c;在介紹這期內容前&#xff0c;我們先來看看這樣的需求&#xff1a;我們有一套房產需要出售&#xff0c…

Unity進階課程【六】Android、ios、Pad 終端設備打包局域網IP調試、USB調試、性能檢測、控制臺打印日志等、C#

Unity打包 Android、ios、Pad 終端設備局域網IP調試、USB調試 今天咱們繼續進階課程&#xff0c;定期更新&#xff0c;有想學習的不懂的地方也可以告訴我。 提示&#xff1a;內容純個人編寫&#xff0c;歡迎評論點贊&#xff0c;來指正我。 文章目錄 Unity打包 Android、ios、P…

c++中的mutex同步機制與多線程同步實現

C 中的 std::mutex 與多線程同步 在多線程編程中&#xff0c;互斥鎖&#xff08;Mutex&#xff09; 是一種同步機制&#xff0c;用于保護共享資源&#xff08;如變量、數據結構&#xff09;免受數據競爭&#xff08;Data Race&#xff09;的影響。C 標準庫中的 std::mutex 提供…

網絡安全2023—新安全新發展

關于綠盟科技 綠盟科技集團股份有限公司(以下簡稱綠盟科技),成立于 2000 年 4 月,總部位于北京。公司于 2014 年 1 月 29 日在深圳證券交易所創業板上市,證券代碼:300369。綠盟科技在國內設有 50余個分支機構,為政府、金融、運營商、能源、交通、科教文衛等行業用戶與各…

WebSocket掃盲

WebSocket 是一種網絡通信協議&#xff0c;它允許在單個 TCP 連接上進行全雙工、雙向的實時通信。它是為了解決傳統 HTTP 協議在實時交互應用中的局限性而設計的。 核心概念和特點 解決 HTTP 的痛點&#xff1a; 單向性&#xff1a; HTTP 是請求-響應模式。客戶端發起請求&…

Springboot整合高德地圖

1.登錄高德開放平臺 高德開放平臺 | 高德地圖API 2.獲取密鑰key 1.點擊控制臺 2.創建新應用 3.添加key 4.創建key 5.獲取key 3.java整合 1.高德配置類 package com.thk.controller.map;import org.springframework.beans.factory.annotation.Value; import org.springfram…

【SQL知識】PDO 和 MySQLi 的區別

目錄 簡介 主要區別 預處理語句示例比較 PDO 示例 MySQLi 示例 選擇建議 簡介 PDO (PHP Data Objects) 和 MySQLi (MySQL Improved) 都是 PHP 中用于數據庫操作的擴展&#xff0c;都支持預處理語句&#xff0c;但有一些重要區別&#xff1a; 主要區別 數據庫支持 PDO&am…

python打卡 DAY 45 Tensorboard使用介紹

目錄 一、TensorBoard 發展歷史與原理 1. 演進歷程 2. 核心架構原理 二、TensorBoard 核心功能操作 1. 基礎配置方法 2. 常用功能速查表 三、CIFAR10 實戰演示 1. MLP 模型監控配置 2. CNN 特征可視化 四、TensorBoard 高級功能 1. 超參數調優 2. 3D點云可視化 五、…

Swift 中 Result 類型全解析:從基礎到進階

在現代 iOS 開發中&#xff0c;Swift 的 Result 類型是處理同步與異步錯誤的一大利器。相比傳統的 throws / do-catch 語法&#xff0c;它更清晰、結構化&#xff0c;也更易于組合式編程。 本文將帶你從 Result 的基礎定義出發&#xff0c;逐步深入其在實際項目中的多種應用&am…

Github 2025-06-28 Rust開源項目日報 Top10

根據Github Trendings的統計,今日(2025-06-28統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Rust項目10Rust實現的非官方Bitwarden兼容服務器 創建周期:2317 天開發語言:Rust協議類型:GNU Affero General Public License v3.0Star數量…

python 寫一個判斷文本中是否有手機號的函數,并提取出文本中的手機號

我們需要判斷文本中是否有手機號&#xff0c;并提取出手機號。 中國大陸的手機號規則&#xff1a; 1. 通常為11位數字。 2. 目前手機號段分配如下&#xff1a; - 移動號段&#xff1a;134(0-8)、135、136、137、138、139、147、148、150、151、152、157、158、159、172、178、1…

作物生長模型Oryza V3實戰12:drate程序詳解

drate(v2).exe,可以通過觀察移植日、穗部分化、開花和成熟的物候日期(即日和年),DRATE(v2)用于校準四個階段的發展速率:幼苗期(DVRJ,oCday-1)、光周期敏感期(DVRI,oCday-1)、穗部發育期(DVRP,oCday-1)和生殖期(DVRR,oCday-1)。 一 準備輸入文件 1、準備.crp,.…