讲个大部分数据结构和算法教科书中都不会讲的问题

数据结构书中代码 数据结构代码实现 串,链,树,图 哈夫曼 约瑟夫游戏 立即下载

讲个大部分数据结构和算法教科书中都不会讲的问题

大部分数据结构和算法书籍中,在讲某种数据结构和算法的时候,都会拿整数、字符串这些基本数据类型,作为要处理的数据的类型。实际上,在真实的软件开发中,数据结构中存储的数据、算法要处理的数据,往往都不是简单的整数,而是”对象“。这里的”对象“很好理解,就是编程语言的中的”类与对象“中的对象。比如下面这几行Java代码,我们用红黑树来存储Order订单对象。

// 红黑树来存储订单,key是订单ID,value是订单对象
private TreeMap<long, Order> id2OrderMap = new TreeMap<>();
public void add(Order order) {
    // 添加一个订单
    id2OrderMap.put(order.id, order);
}
private class Order {
    // 订单类
    public long id;
    public long userId;
    public long createTime;
    // ...more fields...
}

不过,你可能会有疑问,既然在真实的软件开发中,数据结构和算法要处理的都是对象,那为啥书本中都可以按照拿整数(或字符串)类型,而不是对象来讲解呢?

我们知道,数据结构和算法要解决的都是”更快“、”更省“的问题。更快指代码的执行速度,更省指存储空间的消耗。

”更快“这里你先简单理解为”查找更快“,当然还有增删改以及一些统计操作,不过,都差不多,你理解了”查找“,其他的操作也就都理解了。我们在一组数据中,查找一个想要的数据的时候,都是通过某个键值(key)来查找的。

这里的键值怎么理解呢?我们拿刚刚的订单的例子来说明一下。我们希望在这组订单中,按照订单ID来快速的查找订单。那我们就把订单的ID看做键值(key),并且按照key来组织成红黑树这种数据结构。红黑树中存储的是key值和订单对象的内存地址,而订单对象本身是存储在另外的内存空间中的(像Java这种语言,就是存储在堆内存中的)。

为了方便你理解,我画了一张图,你可以对比着文字描述看下。

讲个大部分数据结构和算法教科书中都不会讲的问题

那你可能说,那我要是再想通过订单的用户ID来查找订单呢?这个时候该怎么办呢?

你就可以再以用户ID作为键值,创建另外一个红黑树。实际上,这就是我们之前文章中提到的多重索引结构。如果翻译成Java代码的话,就是下面这一个样子。

// 两个索引
private TreeMap<long, Order> id2OrderMap = new TreeMap<>();
private TreeMap<long, Order> userId2OrderMap = new TreeMap<>();
public void add(Order order) {
    // order在外部创建,内存中只有一份
    id2OrderMap.put(order.id, order);
    userId2OrderMap.put(order.userId, order);
}
private class Order {
    public long id;
    public long userId;
    public long createTime;
    // ...more fields.
}

如果画成图的话,就是下面这个样子。你会发现,订单对象是只有一份的,而索引结构有两份,一份是按照订单的ID作为键值创建的,另一份是按照订单的用户ID作为键值创建的。

讲个大部分数据结构和算法教科书中都不会讲的问题

你可能会说,两份索引是不是比较浪费内存空间啊?实际上,并不会。

从我前面的讲解中,你应该已经知道,索引中存储的只是就键值和对象的内存地址,如果键值是大小比较小的整数,而对象是比较大的对象(数据本身),那索引所占用内存空间比起对象所占用的内存空间来说,要小很多。

还是刚才那个订单的例子,如果一个订单对象中包含很多字段,大小是1KB,而红黑树索引中,每个节点(对应一个订单对象)的大小要远小于1KB(这个你可以自己算下)。所以,所占用内存空间会远小于订单数据本身存储所需的内存空间。

也就是说,在实际上的软件开发中,如果你要存储、要处理的是大对象,那索引所占的内存空间,是可以忽略的。当然,这个要权衡实际上情况来看,不可生搬硬套。

回到开头的问题,既然真实的软件开发中,数据结构和算法处理的数据类型都是对象,那为什么大部分数据结构和算法教科书中,都是拿整数类型来讲解呢?

因为我们在构建数据结构的时候,是按照键值构建,算法在执行的时候,也是按照键值来处理数据。键值一般都是整数或者字符串这些基本类型,我们拿基本类型来讲解,简单明了,足够了。

SAP Gateway 故障排查全景图:从 Error Log 到 E2E 追踪,一套面向实战的工具与方法论 本文针对SAP Gateway Foundation(SAP_GWFND)的故障排查需求,梳理了从现象到根因的系统化排查路径。文章首先强调建立标准化排障流程的重要性,随后提供工具矩阵及使用顺序指引:对于请求中断优先查看Error Log(/IWFND/ERROR_LOG和/IWBEP/ERROR_LOG),性能问题使用Performance Trace(/IWFND/TRACES),通知异常则检查Notification Monitor。重点工具包括: Error Log作为中断类错误首要定位器; Appl 阅读详情

相关推荐

EBS开发_创建AP付款

--以下代码于20181002在Tony环境测试通过 /* BEGIN   --mo_global.init('SQLAP');   apps.fnd_global.apps_initialize(user_id =&gt; 1110, resp_id =&gt; 50597, resp_appl_id =&gt; 20003);   --mo_global.set_policy_context(...

蜗牛先生快跑的博客 4767

代码运行不了找问题

一、缺少东西:1、()、{ }、” ”、等成对出现的东西——双击{,属于这个大括号的内容就会自动选中 单击{,另外的一个大括号就会被方形框框住 2、看哪里少了结束符; 二、纠正错误:1、格式错误:看所有的()、{}、“”、;、是不是都是英文的,不是英文的下面一般有红波浪线报错 2、单词错误:看每个单词都...

ss 的博客 6014

机械臂速成小指南(八):标准DH法实战——从连杆坐标系到运动学方程

本文详细介绍了机械臂运动学建模中的标准DH法,从连杆坐标系的建立到运动学方程的求解,提供了实用的操作步骤和代码示例。通过DH参数表和变换矩阵的构建,帮助读者快速掌握机械臂运动学建模的核心技术,并解决实际应用中的常见问题。

oo7890的博客 211

强化学习《基于策略 - PPO,TRPO,PPO2》

在上一篇博客最后,我们说到了θ和θ^k是不能差太多的,不然结果会不好,那么怎么避免它们差太多呢? 这就是这一篇要介绍的PPO所在做的事情。 1:PPO1算法: 2:TRPO算法 3:PPO2算法

qq_29367075的博客 776

STM32F4的sct文件理解

原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_34008805的博客 995

2026 具身智能 VLA/WAM 全栈学习与训练路线:从动作建模、SFT、RL 到世界模型的 RTX PRO 6000 96GB 单卡实战指南

我会把这张表做成“”而不是只列论文名:先核对每个模型截至的公开代码、训练目标和数据接口,再单独给你一套。对于没有公开、只有推理代码或训练细节不完整的模型,我会明确标出来,避免把“论文里提到”误写成“可复现”。目前有一个重要更新:。截至今天 NVIDIA 官方开源主线已经是换成 Cosmos-Reason2-2B/Qwen3-VL 架构,动作端仍是连续路线,而且官方明确给出单卡微调时默认只训练,峰值显存约。所以你的 96GB 单卡对 GR00T SFT 非常宽裕。可以。下面我按,把它整理成一张真正面向“

u013250861的博客 445

大佬们不会告诉你的史上最全的Java进阶书籍推荐

学习Java,书籍是必不可少的学习工具之一,尤其是对于自学者而言。废话不多说,下边就给大家推荐一些Java进阶的好书。 第一部分:Java语言篇 电子文档 1.《Java编程规范》 适合对象:初级、中级 电子文档 介绍:这本书的作者是被誉为Java之父的James Gosling,入门者推荐阅读,对基础的讲解很不错。 2.《Java编程思想》 适合对象:初级、中级 电子文档 介绍:豆瓣给出了9.1的评分,全球程序员广泛赞誉。有人说这本书不适合初学者,不过小编认为作者并没有对读者已有...

mid56579的博客 2141

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2202

数据结构算法

线性表 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。 ​ 算法思想:搜索整个顺序表,查找最小值元素并记住其位置,搜索结束后用最后一个元素填空出的原最小值元素的位置。 bool Del_Min(sqList &L, EleType &value) { //删除顺序表L中最小值元素节点,并通引用性参数value返回其值 //若删除成功,则返回true;否则返回false if(L.length==0

weixin_42176038的博客 1138

制作一款精美的 Qt IFW 安装程序

对于 Qt IFW 来说,默认的安装界面并不吸引人。倘若要制作一款精美的安装程序,这显然是不够的,需要在此基础上进行一系列定制。

青春不老,奋斗不止! 5260

RK3568 上C图像camera图像采集应用实例(二)

本文探索rk3568上实现C语言的 通过C v4l2 接口 采集图像 ,刷屏控制 drm的显示camera图像中 实现camera preview 预览 的实践和探索。

luoshanxuli2010的专栏 761

讲个大部分数据结构和算法教科书中都不会讲的问题,互联网寒冬

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。2、Redis学习笔记及学习思维脑图。

m0_61067876的博客 309

《多模态融合改进》目录一览 | 专栏介绍 :全网 第一份 完整的多模态改进教程,提供《多模态模型改进完整项目包》-开箱即用

在大家订阅专栏后,便可获得多模态模型改进完整项目包-开箱即用,方便简单

Limiiiing的博客 1万+

2024年大数据最新讲个大部分数据结构和算法教科书中都不会讲的问题(1),2024年最新彻底帮你搞懂

这里的键值怎么理解呢?红黑树中存储的是key值和订单对象的内存地址,而订单对象本身是存储在另外的内存空间中的(像Java这种语言,就是存储在堆内存中的)。我们在一组数据中,查找一个想要的数据的时候,都是通过某个键值(key)来查找的。你会发现,订单对象是只有一份的,而索引结构有两份,一份是按照订单的ID作为键值创建的,另一份是按照订单的用户ID作为键值创建的。不过,你可能会有疑问,既然在真实的软件开发中,数据结构和算法要处理的都是对象,那为啥书本中都可以按照拿整数(或字符串)类型,而不是对象来讲解呢?

2401_84182906的博客 780

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

2024年讲个大部分数据结构和算法教科书中都不会讲的问题,2024年最新大数据开发高级工程师每日面试题精选

这里的键值怎么理解呢?红黑树中存储的是key值和订单对象的内存地址,而订单对象本身是存储在另外的内存空间中的(像Java这种语言,就是存储在堆内存中的)。”更快“这里你先简单理解为”查找更快“,当然还有增删改以及一些统计操作,不过,都差不多,你理解了”查找“,其他的操作也就都理解了。我们在一组数据中,查找一个想要的数据的时候,都是通过某个键值(key)来查找的。不过,你可能会有疑问,既然在真实的软件开发中,数据结构和算法要处理的都是对象,那为啥书本中都可以按照拿整数(或字符串)类型,而不是对象来讲解呢?

2401_84591827的博客 607

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

2024年最新讲个大部分数据结构和算法教科书中都不会讲的问题(2),2024年最新2024年阿里大数据开发面试题及答案

我们希望在这组订单中,按照订单ID来快速的查找订单。红黑树中存储的是key值和订单对象的内存地址,而订单对象本身是存储在另外的内存空间中的(像Java这种语言,就是存储在堆内存中的)。从我前面的讲解中,你应该已经知道,索引中存储的只是就键值和对象的内存地址,如果键值是大小比较小的整数,而对象是比较大的对象(数据本身),那索引所占用内存空间比起对象所占用的内存空间来说,要小很多。你会发现,订单对象是只有一份的,而索引结构有两份,一份是按照订单的ID作为键值创建的,另一份是按照订单的用户ID作为键值创建的。

2301_79099434的博客 804

​​来自极客时间专栏《数据结构与算法之美》

“算法,先于计算机存在于世,比编程语言本身更为重要。语言只是工具,算法才是灵魂。”这是云风在《游戏之旅:我的编程感悟》这本书里一个非常经典的表述。 市面上算法书比比皆是,究竟哪些书值得看,哪些书适合什么基础的人来看呢? 鉴于此,我针对不同层次、不同语言的程序员,我分别选择了不同的书。你可以看看自己究竟处于哪个层次,来对症下药。希望每位想在数据结构与算法上得到提升的同学,都能找到适合自己的学习资料,...

hayaqi0504的博客 754

算法导论吃透后的水平_市面上算法书比比皆是,究竟哪些书值得看?

“算法,先于计算机存在于世,比编程语言本身更为重要。语言只是工具,算法才是灵魂。”这是云风在《游戏之旅:我的编程感悟》这本书里一个非常经典的表述。市面上算法书比比皆是,究竟哪些书值得看,哪些书适合什么基础的人来看呢?鉴于此,我针对不同层次、不同语言的程序员,我分别选择了不同的书。你可以看看自己究竟处于哪个层次,来对症下药。希望每位想在数据结构与算法上得到提升的同学,都能找到适合自己的学习资料,都能...

weixin_39588104的博客 7237

程序员必备的数据结构与算法书单

作者 | 王争出处 | 极客时间《数据结构与算法之美》专栏“算法,先于计算机存在于世,比编程语言本身更为重要。语言只是工具,算法才是灵魂。”这是云风在《游戏之旅:我的编程感悟》这本书里一个非常经典的表述。市面上算法书比比皆是,究竟哪些书值得看,哪些书适合什么基础的人来看呢?鉴于此,我针对不同层次、不同语言的程序员,我分别选择了不同的书。你可以看看自己究竟处于哪个层次,来对症下药。希望每位想在数据结...

weixin_33916256的博客 587

Linux操作系统-教科书不会讲的细节:Linux进程状态的“深度表情”

那么此时就会拿运行状态的进程开刀,虽然进程处于运行状态,但是我们都知道,除去当前在cpu上运行的,其他的进程本质还是在后面等着的,那么就和上面的阻塞状态是一样的,所以同样会把处于运行状态的进程的代码和数据交换到swap分区中来腾出空间,此时的状态就称为。是不是一下感觉问题就严重了,当然一些无关紧要的数据丢了就丢了,但是那些很重要的数据一旦丢了后果是很严重的,造成的损失是很大的,我们总不能去赌这部分数据不重要吧,并且在这个过程中系统,进程,硬盘都没有做错,做的都是份内工作。

2301_80236968的博客 1624

如何高效学习数据结构和算法?

大部分人在第一次接触数据结构和算法时,都会感到十分抽象,晦涩难懂,不知道如何下手,甚至直接劝退。其实这是正常的,因为大部分人在学习之初,都没有掌握一定的方法,所以才会出现这种情况。那么今天我们就来聊一聊高效学习这一学科。大部分数据结构和算法教科书,在开篇都会给这两个概念下一个明确的定义。

qq_46094651的博客 218
上一篇: 豆瓣上9分以上的Java技术书籍——附知识整理
下一篇: 别再问什么是Java内存模型了,看这里!
大G哥
博客等级 码龄9年 5303粉丝 1408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值