数据结构与算法分析实验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.mzph.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。