數據結構與算法分析實驗11 實現順序查找表

實現順序查找表

  • 1.上機名稱
  • 2.上機要求
  • 3.上機環境
  • 4.程序清單(寫明運行結果及結果分析)
    • 4.1 程序清單
      • 4.1.1 頭文件
      • 4.1.2 實現文件
      • 4.1.3 源文件
    • 4.2 實現展效果示
  • 上機體會

1.上機名稱

實現順序查找表

  1. 順序查找表的基本概念
    順序查找表是一種線性數據結構,通常用于存儲一組元素。這些元素在表中按順序排列,查找操作通過逐個比較表中的元素來實現。順序查找表適用于小規模數據或不需要頻繁查找的場景。

  2. 順序查找表的特點
    順序查找表的主要特點是其簡單性和直接性。由于元素是按順序存儲的,查找操作需要從表的一端開始,逐個比較元素,直到找到目標元素或遍歷完整個表。這種查找方式的時間復雜度為 O(n),其中 n 是表中元素的數量。

  3. 順序查找表的實現
    順序查找表可以通過數組或鏈表來實現。數組實現的順序查找表在內存中是連續存儲的,而鏈表實現的順序查找表則通過指針鏈接各個元素。
    順序查找表的優缺點
    順序查找表的優點是實現簡單,插入操作的時間復雜度為 O(1)。缺點是查找操作的時間復雜度較高,為 O(n),尤其是在數據量較大的情況下,查找效率較低。

  4. 順序查找表的應用場景
    順序查找表適用于數據量較小、查找操作不頻繁的場景。例如,在小型緩存系統或簡單的任務隊列中,順序查找表可以提供足夠的性能。

  5. 順序查找表的優化
    為了提高順序查找表的查找效率,可以采用一些優化策略,如將頻繁訪問的元素移動到表的前面,或者使用二分查找等更高效的查找算法。然而,這些優化通常需要額外的存儲空間或更復雜的數據結構。

2.上機要求

(1)實現無序的順序查找表,實現插入鍵值對、按照關鍵字查詢、刪除記錄等操作
(2)實現有序的順序查找表,實現插入鍵值對、按照關鍵字查詢、刪除記錄等操作

3.上機環境

visual studio 2022
Windows11 家庭版 64位操作系統

4.程序清單(寫明運行結果及結果分析)

4.1 程序清單

4.1.1 頭文件

#pragma once
#include<iostream>
#include<string>
#define MAX_LEN 64
using namespace std;
//在此項目里,默認采用從大到小的排序順序
typedef std::string Key;	//鍵
typedef std::string Value;	//值
enum Type {_ORDER, DIS_ORDER
};
//Node結構體包含兩個成員變量:key和val,分別用于存儲鍵和值。
struct Node{Key key;Value val;
};class Record {
public:Record(int flag);	//用于初始化Record對象,flag表示記錄是有序還是無序。~Record();void push(Key key, Value val); 	//用于將鍵值對添加到記錄中。void search(Key key); 			//用于查找指定鍵的記錄。void search(); 					//用于交互式查找記錄。void erease(Key key); 			//用于刪除指定鍵的記錄。void printinfo(int i);			//用于打印指定索引的記錄信息。void searchkey(int low, int high, Key key);//用于在指定范圍內查找鍵。void view();					//用于查看所有記錄。int getsize();					//用于獲取當前記錄的數量。
private:Node* base;		//基址int curlen;		//現有長度int maxlen;		//空間尺度int flag;		//標記是無序還是有序
};

4.1.2 實現文件

#include "Sq_Search.h"
Record::Record(int flag){this->curlen = 0;this->maxlen = MAX_LEN;this->base = new Node[maxlen];memset(base, 0, sizeof(base));this->flag = flag;
}Record::~Record(){delete[]base;this->curlen = 0;this->maxlen = 0;
}void Record::push(Key key, Value val){if (curlen + 1 > maxlen) {Node* fresh = new Node[maxlen * 2];maxlen *= 2;memset(fresh, 0, sizeof(fresh));for(int i =0;i<curlen;i++){fresh[i].key = base[i].key;fresh[i].val = base[i].val;}delete[]base;base = fresh;}switch (flag){case _ORDER: {int i = 0;while (base[i].key.compare(key) > 0&&i<curlen) i++;int cord = i;for (i = curlen; i > cord && i > 0; i--) {base[i] = base[i - 1];}base[cord].key = key;base[cord].val = val;++curlen;break;}case DIS_ORDER: {base[curlen].key = key;base[curlen].val = val;++curlen;break;}default: {cout << "No Type!" << endl;exit(1);break;}}
}void Record::search(Key key){switch (flag){case _ORDER: {searchkey(0,curlen-1,key);break;}case DIS_ORDER: {int i = 0;while (i < curlen && base[i].key.compare(key))i++;if (i == curlen)cout << "Can't find key!" << endl;else printinfo(i);break;}default:exit(3);break;}
}void Record::search(){cout << "please enter a key to search>>" << endl;string str;cin >> str;search(str);
}void Record::erease(Key key){int i = 0;while (i < curlen && base[i].key.compare(key))i++;if (i == curlen)cout << "Can't find key!" << endl;else {for (int j = i; j < curlen; j++) {base[j].key = base[j + 1].key;base[j].val = base[j + 1].val;}--curlen;cout << "Erease  " << key << ">>" << endl;}
}void Record::printinfo(int i){cout << base[i].val << endl;
}void Record::searchkey(int low, int high,Key key){int mid = (low + high) / 2;if (mid >= high && base[mid].key.compare(key)) { cout << "Can't find key!" << endl; return; }if ( base[mid].key.compare(key) == 0) { printinfo(mid); return; }if ( base[mid].key.compare(key) < 0) { searchkey(low, mid - 1, key); }if ( base[mid].key.compare(key) > 0) { searchkey(mid + 1, high, key); }
}void Record::view(){for (int i = 0; i < curlen; i++) {cout <<base[i].key<<"\t--\t";printinfo(i);}
}int Record::getsize(){return curlen;
}

4.1.3 源文件

#include"Sq_Search.h"
int main() {Record order = Record(_ORDER);Record disorder = Record(DIS_ORDER);order.push("hello", "你好");order.push("world", "世界");order.push("push", "插入");order.push("int", "整型");order.push("max", "最大");order.push("min", "最小");order.push("float", "浮點型");disorder.push("hello", "你好");disorder.push("world", "世界");disorder.push("push", "插入");disorder.push("int", "整型");disorder.push("max", "最大");disorder.push("min", "最小");disorder.push("float", "浮點型");cout << "view order:\n";order.view();cout << "view disorder:\n";disorder.view();order.search("hello");disorder.search("world");order.erease("hello");order.view();order.search();
}

4.2 實現展效果示

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

上機體會

通過這次實驗,我深刻認識到理論知識和實踐經驗的重要性。在實現順序查找表的過程中,我不僅掌握了基本的算法知識,還學會了如何優化代碼以提高性能。此外,通過對比不同查找方法,我了解了各種方法的優缺點,為未來的應用開發提供了參考。
盡管順序查找表在某些場景下仍有應用價值,但在大規模數據集上,其性能表現并不理想。因此,在實際應用中,我們需要根據具體需求選擇合適的查找方法。對于需要頻繁查找的數據,可以考慮使用哈希查找等高效算法。而對于只需在小規模數據上完成簡單查找的任務,順序查找表仍是一種簡單、可靠的選擇。
在無序查找表中,查找時間復雜度為O(n),在有序查找表中,查找時間復雜度為O(log n)對于數據量大的情況,顯然有序表更占優勢。

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

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

相關文章

實踐官方的 A2A SDK Python

內容列表 ? 注意? 我的環境? A2A SDK Python 注意 這只是一個原型&#xff0c;并且在快速的變化&#xff0c;本篇教程也隨時可能過期&#xff0c;可以在A2AProtocol blog最終更新的文章。 我的環境 ? Python 3.13? uv: uv 0.7.2 (Homebrew 2025-04-30)? Warp? Olla…

langchain 接入國內搜索api——百度AI搜索

為什么使用百度AI搜索 學習langchain的過程中&#xff0c;遇到使用search api的時候&#xff0c;發現langchain官方文檔中支持的搜索工具大多是國外的&#xff0c;例如google search或bing search&#xff0c;收費不說&#xff0c;很多還連接不上&#xff08;工具 | LangChain…

[強化學習的數學原理—趙世鈺老師]學習筆記01-基本概念

[強化學習的數學原理—趙世鈺老師]學習筆記01-基本概念 1.1 網格世界的例子1.2 狀態和動作1.3 狀態轉移1.4 策略1.5 獎勵1.6 軌跡、回報、回合1.6.1 軌跡和回報1.6.2 回合 1.7 馬爾可夫決策過程 本人為強化學習小白&#xff0c;為了在后續科研的過程中能夠較好的結合強化學習來…

Java開發經驗——阿里巴巴編碼規范經驗總結2

摘要 這篇文章是關于Java開發中阿里巴巴編碼規范的經驗總結。它強調了避免使用Apache BeanUtils進行屬性復制&#xff0c;因為它效率低下且類型轉換不安全。推薦使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手動賦值等替代方案。文章還指出不應在視圖模板中加入復雜邏…

Java大師成長計劃之第18天:Java Memory Model與Volatile關鍵字

&#x1f4e2; 友情提示&#xff1a; 本文由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;平臺gpt-4o-mini模型輔助創作完成&#xff0c;旨在提供靈感參考與技術分享&#xff0c;文中關鍵數據、代碼與結論建議通過官方渠道驗證。 在Java多線程編程中&#xff0c;線程…

js前端分片傳輸大文件+mongoose后端解析

最近一直在完善mongoose做webserver的項目&#xff0c;其中程序升級要通過前端傳輸升級包到服務器。 因為第一次寫前端代碼&#xff0c;分片傳輸的邏輯&#xff0c;網上一堆&#xff0c;大同小異&#xff0c;而且版本啊&#xff0c;API不一致的問題&#xff0c;導致頭疼的很。后…

MiniMind:3塊錢成本 + 2小時!訓練自己的0.02B的大模型。minimind源碼解讀、MOE架構

大家好&#xff0c;我是此林。 目錄 1. 前言 2. minimind模型源碼解讀 1. MiniMind Config部分 1.1. 基礎參數 1.2. MOE配置 2. MiniMind Model 部分 2.1. MiniMindForCausalLM: 用于語言建模任務 2.2. 主干模型 MiniMindModel 2.3. MiniMindBlock: 模型的基本構建塊…

引言:Client Hello 為何是 HTTPS 安全的核心?

當用戶在瀏覽器中輸入 https:// 時&#xff0c;看似簡單的操作背后&#xff0c;隱藏著一場加密通信的“暗戰”。Client Hello 作為 TLS 握手的首個消息&#xff0c;不僅決定了后續通信的加密強度&#xff0c;還可能成為攻擊者的突破口。據統計&#xff0c;超過 35% 的網站因 TL…

Dockerfile 完全指南:從入門到最佳實踐

Dockerfile 完全指南&#xff1a;從入門到最佳實踐 1. Dockerfile 簡介與作用 Dockerfile 是一個文本文件&#xff0c;包含了一系列用于構建 Docker 鏡像的指令。它允許開發者通過簡單的指令定義鏡像的構建過程&#xff0c;實現自動化、可重復的鏡像構建。 主要作用&#xf…

Python httpx庫終極指南

一、發展歷程與技術定位 1.1 歷史演進 起源&#xff1a;httpx 由 Encode 團隊開發&#xff0c;于 2019 年首次發布&#xff0c;目標是提供一個現代化的 HTTP 客戶端&#xff0c;支持同步和異步操作&#xff0c;并兼容 HTTP/1.1 和 HTTP/2。背景&#xff1a; requests 庫雖然功…

app加固

1、什么是加固? 我們之前講的逆向,大多數都是用加密算法去加密一些明文字符串,然后把得到的結果用 Base64、Hex等進行編碼后提交。加固其實也一樣&#xff0c;只不過他通常加密的是 dex文件而已。但是 dex 文件加密以后&#xff0c;安卓系統是沒法直接運行的。所以加固的核心&…

Win全兼容!五五 Excel Word 轉 PDF 工具解決多場景轉換難題

各位辦公小能手們&#xff01;今天給你們介紹一款超牛的工具——五五Excel Word批量轉PDF工具V5.5版。這玩意兒專注搞批量格式轉換&#xff0c;能把Excel&#xff08;.xls/.xlsx&#xff09;和Word&#xff08;.doc/.docx&#xff09;文檔唰唰地變成PDF格式。 先說說它的核心功…

springCloud/Alibaba常用中間件之Nacos服務注冊與發現

文章目錄 SpringCloud Alibaba:依賴版本補充六、Nacos:服務注冊與發現1、下載安裝Nacos2、服務注冊1. 導入依賴(這里以服務提供者為例)2. 修改配置文件和主啟動類3. 創建業務類4. 測試 3.服務映射1. 導入依賴2. 修改配置文件和主啟動類3. 創建業務類和RestTemplate配置類用來提…

uniapp中score-view中的文字無法換行問題。

項目場景&#xff1a; 今天遇到一個很惡心的問題&#xff0c;uniapp中的文字突然無法換行了。得..就介樣 原因分析&#xff1a; 提示&#xff1a;經過一fan研究后發現 scroll-view為了能夠橫向滾動設置了white-space: nowrap; 強制不換行 解決起來最先想到的是&#xff0c;父…

【STM32 學習筆記】I2C通信協議

注&#xff1a;通信協議的設計背景 3:00~10:13 I2C 通訊協議(Inter&#xff0d;Integrated Circuit)是由Phiilps公司開發的&#xff0c;由于它引腳少&#xff0c;硬件實現簡單&#xff0c;可擴展性強&#xff0c; 不需要USART、CAN等通訊協議的外部收發設備&#xff0c;現在被廣…

【網絡原理】數據鏈路層

目錄 一. 以太網 二. 以太網數據幀 三. MAC地址 四. MTU 五. ARP協議 六. DNS 一. 以太網 以太網是一種基于有線或無線介質的計算機網絡技術&#xff0c;定義了物理層和數據鏈路層的協議&#xff0c;用于在局域網中傳輸數據幀。 二. 以太網數據幀 1&#xff09;目標地址 …

控制臺打印帶格式內容

1. 場景 很多軟件會在控制臺打印帶顏色和格式的文字&#xff0c;需要使用轉義符實現這個功能。 2. 詳細說明 2.1.轉義符說明 樣式開始&#xff1a;\033[參數1;參數2;參數3m 可以多個參數疊加&#xff0c;若同一類型的參數&#xff08;如字體顏色&#xff09;設置了多個&…

[6-2] 定時器定時中斷定時器外部時鐘 江協科技學習筆記(41個知識點)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 V 30 31 32 33 34 35 36 37 38 39 40 41

數據庫的脫敏策略

數據庫的脫敏策略&#xff1a;就是屏蔽敏感的數據 脫敏策略三要求&#xff1a; &#xff08;1&#xff09;表對象 &#xff08;2&#xff09;生效條件&#xff08;脫敏列、脫敏函數&#xff09; &#xff08;3&#xff09;二元組 常見的脫敏策略規則&#xff1a; 替換、重排、…

Python序列化的學習筆記

1. Npy&Numpy O4-mini-Cursor&#xff1a;如果.npy文件里包含了「Python對象」而非純數值數組時&#xff0c;就必須在加載時加上allow_pickleTrue。