数据结构与算法分析实验11 实现顺序查找表

news2025/7/13 22:05:33

实现顺序查找表

  • 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.coloradmin.cn/o/2375240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

获取高德地图JS API的安全密钥和Key的方法

要使用高德地图JavaScript API&#xff0c;您需要获取API Key和安全密钥(securityJsCode)。以下是获取步骤&#xff1a; 1. 注册高德开放平台账号 首先访问高德开放平台&#xff0c;如果没有账号需要先注册。 2. 创建应用获取Key 登录后进入"控制台" 点击"应…

JAVA研发+前后端分离,ZKmall开源商城B2C商城如何保障系统性能?

在电商行业竞争白热化的当下&#xff0c;B2C 商城系统的性能表现成为决定用户留存与商业成败的关键因素。ZKmall 开源商城凭借 Java 研发与前后端分离架构的深度融合&#xff0c;构建起一套高效、稳定且具备强大扩展性的系统架构&#xff0c;从底层技术到上层应用全方位保障性能…

嵌入式自学第二十天(5.13)

&#xff08;1&#xff09;线性表顺序存储的优缺点&#xff1a; 优点&#xff1a;无需为表中逻辑关系添加额外存储空间&#xff1b; 可以快速随机访问元素&#xff0c;时间复杂度O(1)。 缺点&#xff1a;插入删除需要移动元素O(n&#xff09;&#xff1b; 无法动态存储。 …

快速上手Linux nfs网络文件系统

一、nfs服务的安装与部属 1.安装软件 设置火墙 测试&#xff1a;在客户端上安装nfs-utils后 showmount 服务端IP 2.共享资源 测试&#xff1a; 参数&#xff08;参数写在共享策略文件的括号里&#xff09; 二、nfs客户端动态挂载机制 当客户端和服务器之间没有数据交互时&am…

26考研——中央处理器_异常和中断机制(5)

408答疑 文章目录 五、异常和中断机制异常和中断的基本概念异常和中断的分类异常的分类故障 (Fault)自陷 (Trap)终止 (Abort) 中断的分类可屏蔽中断不可屏蔽中断 异常和中断响应过程关中断保存断点和程序状态识别异常和中断并转到相应的处理程序 八、参考资料鲍鱼科技课件26王道…

数据库实验报告 SQL SERVER 2008的基本操作 1

实验报告&#xff08;第 1 次&#xff09; 实验名称 SQL SERVER 2008的基本操作 实验时间 9月14日1-2节 一、实验内容 数据库的基本操作:包括创建、修改、附加、分离和删除数据库等。 二、源程序及主要算法说明 本次实验不涉及程序和算法。 三、测…

Nature图形复现—两种快速绘制热图的方法

相信大家在科研过程中&#xff0c;会遇到热图&#xff0c;有时候会觉得热图理解起来比较困难&#xff0c;或者觉得绘制热图也比较困难。本期教程我们来深入了解热图、绘制热图。 热图是一种通过颜色深浅或色阶变化来直观展示数据分布、密度或数值大小的可视化工具。它在多个领域…

INFINI Console 纳管 Elasticsearch 9(一):指标监控、数据管理、DSL 语句执行

Elasticsearch v9.0 版本最近已发布&#xff0c;而 INFINI Console 作为一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台&#xff0c;是否支持最新的 Elasticsearch v9.0 集群管理呢&#xff1f;本文以 INFINI Console v1.29.2 为例&#xff0c;从指标监控、数…

texlive 与 Texmaker 安装

一、安装 Texmaker 1、下载Texmaker 链接地址: Texmaker (free cross-platform latex editor) 点击 FREE DOWNLOAD &#xff0c;点击 Texmaker_6.0.1_Win_x64.msi &#xff0c;下载即可。 2、安装Texmaker 双击如下文件 若出现如下&#xff0c;点击更多信息 点击仍要运行 …

机试刷题:进制转换3

题目来源&#xff1a;N诺 一、题目描述 二、解题思路 过程模拟&#xff0c;先转换为十进制&#xff0c;再转换为N进制即可。 注意&#xff1a;转换的时候可能出现字母&#xff0c;注意字母的表示。 用string和char类型对数据进行存储要更方便。 #include <iostream>…

(顺序表、单链表、双链表)==>一篇解决!(Java版)

文章目录 一、线性表二、顺序表三、单链表四、双链表 一、线性表 线性表是最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列。 线性表的特征&#xff1a;数据元素之间具有一种“一对一”的逻辑关系。 线性表的分类&#xff1a; 线…

JPG与PDF格式转换器

该插件可实现JPG与PDF格式的互转。 MainForm.Designer.cs using System.Windows.Forms; namespace JpgToPdfConverter {partial class MainForm{private System.ComponentModel.IContainer components null;protected override void Dispose(bool disposing){if (disposing &…

手搓传染病模型(SEIARW)

在传染病传播的研究中&#xff0c;水传播途径是一个重要的考量因素。SEAIRW 模型&#xff08;易感者 S - 暴露者 E - 感染者 I - 无症状感染者 A - 康复者 R - 水中病原体 W&#xff09;综合考虑了人与人接触传播以及水传播的双重机制&#xff0c;为分析此类传染病提供了全面的…

【Mac 从 0 到 1 保姆级配置教程 15】- Python 环境一键安装与配置,就是这么的丝滑

文章目录 前言安装 Python 环境VSCode 配置Python 环境NeoVim 配置 Python 环境&#xff08;选看&#xff09;1. Python LSP 配置2. 打开 python 语言支持 最后参考资料系列教程 Mac 从 0 到 1 保姆级配置教程目录&#xff0c;点击即可跳转对应文章&#xff1a; 【Mac 从 0 到 …

【递归、搜索与回溯】专题一:递归(二)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人递归&#xff0c;搜索与回溯算法的学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码…

Spark缓存-cache

一、RDD持久化 1.什么时候该使用持久化&#xff08;缓存&#xff09; 2. RDD cache & persist 缓存 3. RDD CheckPoint 检查点 4. cache & persist & checkpoint 的特点和区别 特点 区别 二、cache & persist 的持久化级别及策略选择 Spark的几种持久化…

记录算法笔记(2025.5.13)二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] …

【Linux】简单设计libc库

&#x1f4dd;前言&#xff1a; 经过之间两篇文章&#xff0c;【Linux】基础IO&#xff08;一&#xff09;和【Linux】基础IO&#xff08;二&#xff09;的学些&#xff0c;我们对文件的基础IO已经有了一定的理解。 这篇文章我们来简单设计一下libc库&#xff0c;来复习一下文…

milvus+flask山寨《从零构建向量数据库》第7章case2

继续流水账完这本书&#xff0c;这个案例是打造文字形式的个人知识库雏形。 create_context_db: # Milvus Setup Arguments COLLECTION_NAME text_content_search DIMENSION 2048 MILVUS_HOST "localhost" MILVUS_PORT "19530"# Inference Arguments…

【Canda】常用命令+虚拟环境创建到选择

目录 一、conda常用命令 二、conda 环境 2.1 创建虚拟环境 2.2 conda环境切换 2.3 查看conda环境 2.4 删除某个conda环境 2.5 克隆环境 三、依赖包管理 3.1 安装命令 3.2 更新包 3.3 卸载包 3.4 查看环境中所有包 3.5 查看某个包的版本信息 3.6 搜索包 四、环境…