数据结构+算法=程序设计

什么是数据结构

数据(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,.…