noj数据结构稀疏矩阵的加法十字链表_一个算法毁了一款好游戏?算法和数据结构到底有多重要?...

9d08deefbd637aab50a958795a6d06ef.gif

来源 | 异步

前段时间大火的国产游戏——《太吾绘卷》,由于创新的玩法和精良的制作一度广受好评,然而随着玩家游戏的深入和时长的积累,发现该游戏在玩的过程中游戏外的问题很多很多。

首先是存档速度慢,然后是密集的计算导致功耗大量增加,风扇速度高居不下,甚至在高配置设备中也变得越来越卡。

究其原因,还是开发人员对于算法的理解问题。

431c9b869113f649bf5c4e7e0b49e025.png

该游戏存档是用的json,太吾绘卷在每个月存档时,都要把所有的数据在磁盘上重写一遍。实际上,大多数游戏公司正确的做法是只写入变化的部分而不会全量写入,而太吾绘卷的做法是把很多不变的,预设好的东西也全部重新写入,必然导致存档时占用了极大的空间。

同时,存档中有大量的0,这说明开发者不知道什么叫“稀疏矩阵”,结合之前的全量写入,这无疑又加剧了存档缓慢的问题。

9f18d8ec6b146750978b4c3ac0a04730.png

所以算法和数据结构有多重要的呢,它足以让一款大火的游戏变得不再具有吸引力,哪怕你其他方面做得再好。带来了这么大的影响,恐怕游戏开发组接下来应该考虑更换程序员的事情了。

著名计算机科学家尼古拉斯·沃斯(Niklaus Wirth)有一句在计算机领域人尽皆知的名言“算法+数据结构=程序”(Algorithm+Data Structures=Programs)。

算法这么重要却没有引起国内顶级程序员的重视,不得不说这是一个遗憾。

8f0acd10506c90f18c76542121380b8d.png

其实,要想学习算法,方法大于努力,以下三个思路和方法可以指导你更好的学习算法:

一.记住算法思想,记住算法结构。

这个是数据结构与算法学习最基础的部分。

如果你把算法和数据结构系统的过了一遍,那你应该能够明确这些基本的概念和一些初步的延申问题,什么是数组,堆栈,队列,链表,字典树以及哈希表以及相关的问题,这里所说的记住,是指在自己的脑海中形成长久的记忆。例如以下实用问题:

常见的堆栈面试问题

· 使用堆栈计算后缀表达式

· 对堆栈中的值进行排序

· 检查表达式中的括号是否平衡

那么,记住数据结构又需要记住哪些呢?

第一步:记住数据结构最直观的东西


第二步:记忆某个数据结构的同时,还要记住数据结构的定义,性质与特点。例如在学习哈夫曼树的时候。

定义是WPL最小的二叉树。特点:(1)没有度为1的结点(2)n个叶子结点的哈夫曼树共有2n-1个结点(3)哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树。

在知道它的定义后,我们可以自己去设计一个算法。如果自己没想到,在看到先人的解决办法后,更要随手存下来,去记住它。

8ccf57298ee50da65a829294ba3b68b8.png

二、用编程语言实现数据结构的算法

很多时候,理解一个算法后,很容易在纸上去模拟一个算法的实现过程。

但,具体实现,则是另一回事。一定得先自己思考,然后再去看书中给的编程语言实现。这一过程已经不属于“数据结构与算法”的内容了。而是你综合素质的体现,如何真正理解问题和用编程技巧实现,很考验自己。

这一过程,很难靠记忆。需要在不断敲代码的过程中去体会一些直觉上的东西。如何用递归解决问题,如何使用循环,如何使用"哨兵”等等等等。当然,敲完后需要去思考总结,看看能不能总结出一些”小套路“并记住。

总之,实践出真知

280fcc5b87b925421b2d7dae0ffd99ee.png

三、记住特定情况特定的算法搭配

每介绍一种数据结构,都可以联系一个实际问题来作为“引子”,回答了“这种数据结构为什么会出现”。

比如上述案例中提到的稀疏矩阵,通俗地说,如果边的数量接近于与顶点的数量呈线性关系,那么这个图就是稀疏图,例如,具有n个顶点和O(n log n)条件的图一般被认为是稀疏图。

这些东西,我们也须理解记忆。每一数据结构都有其特性,去解决某一类问题,我们需要去记忆,去感悟。


威著作,助力学习

4bbb33dd16decbaf9777170fc8e53ffa.png

本书是作者Tim Roughgarden(斯坦福大学的教授,主要教授的课程有计算机科学、管理科学与工程。著有图书《算法详解(第1卷):算法基础》)结合在斯坦福大学教授算法课程的实际经验编写的系列教程中的第二本。

主要介绍图搜索及其应用,最短路径算法以及一些数据结构(如堆、搜索树、散列表和Bloom过滤器)的应用和实现。

本书是作者Tim Roughgarden(斯坦福大学的教授,主要教授的课程有计算机科学、管理科学与工程。著有图书《算法详解(第1卷):算法基础》)

结合在斯坦福大学教授算法课程的实际经验编写的系列教程中的第二本。

主要介绍图搜索及其应用,最短路径算法以及一些数据结构(如堆、搜索树、散列表和Bloom过滤器)的应用和实现。

44797291d4f8dc349c1b031901dd8de4.png
80aa8f06970b521ea4c3366eea612386.png

查看目录

第1章 图的基础知识

1.1 基本术语

1.2 图的一些应用

1.3 图形的度量

1.3.1 小测验1.1邻接矩阵

1.4.3 和小测验1.3零代价的基本算法

2.1.3 高层思路

2.2.2 BFS正确性和运行时间

2.2.5 的答案

2.3 计算连通分量

2.3.1 (无向图连通分量)算法

2.3.4 UCC小测验2.2的伪码

2.4.3 什么时候存在拓扑顺序

2.5.3 的拓扑排序

2.5.5 小测验2.3为什么要使用深度优先的搜索

2.6.3 一个例子

2.6.6 和小测验2.6蝴蝶结

2.7.3 一些前提条件

3.1.3 的答案

3.2 Dijkstra算法

3.2.1 一种虚假的简化

3.3.2 Dijkstra选择正确的数据结构

4.1.2 其他操作

4.3 堆的应用

4.3.1 应用:中位值维护

4.4 Dijkstra算法的提速

4.4.1 维持不变性

4.4.4 数组形式的堆

4.5.3 操作

4.5.4 操作

4.6 本章要点

4.7 章末习题

挑战题

编程题

第5章 搜索树

5.1 有序数组

5.1.1 搜索树的属性

5.3.2 (高度)时间内实现Search

5.3.4 和Max

5.3.5 时间内实现OutputSorted操作

5.3.8 强化的搜索树支持Select的答案

*5.4 平衡搜索树

5.4.1 的答案

*6.4 更多的实现细节

6.4.1 负载和性能

6.4.2 管理散列表的负载

6.4.3 选择散列函数

6.4.4 选择冲突解决策略

6.4.5 小测验6.6的答案

6.5 布隆过滤器的基础知识

6.5.1 布隆过滤器支持的操作

6.5.2 布隆过滤器的应用

6.5.3 布隆过滤器的实现

*6.6 布隆过滤器的启发式分析

6.6.1 启发式假设

6.6.2 部分位被设置为1

6.6.3 假阳性率

6.6.4 结束语

6.6.5 小测验6.7的答案

6.7 本章要点

6.8 章末习题

编程题

附录A 快速回顾渐进性表示法

部分习题答案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347957.shtml

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

相关文章

arm-linux-gcc libstdc .so.6,mini2440编译内核:usr/lib/libstdc++.so.6 not found

买了块mini2440开发板,按照光盘中的mini2440用户手册编译内核时,#make zImage出现错误:usr/lib/libstdc.so.6 not found,在网上百度了下,有很多不同的解决办法,我试了一个,编译成功 ^ ^注&#…

前端实现可绘制的canvas画布_前端图形学基础(五)——Canvas状态管理

点击右上角的关注,不定期前端干货分享!!欢迎来到我的前端图形学系列文章:前端图形学基础(一)——Canvas基础入门前端图形学基础(二)——Canvas基础前端图形学基础(三)——Canvas绘制图片前端图形学基础(四)——Canvas绘制曲线我们…

having和where可以同时使用吗_阴、阳离子聚丙烯酰胺可以同时混合溶解使用吗?...

聚丙烯酰胺是一种水处理药剂,需要溶解在水中制成浓度为0.1%-0.5%的聚丙烯酰胺水溶液。一般来说,当聚丙烯酰胺实际使用时,阴离子聚丙烯酰胺和阳离子聚丙烯酰胺可以同时使用。但是,阳离子聚丙烯酰胺和阴离子聚丙烯酰胺不能混合在一起…

Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回

在上一篇有关Lombok库的文章中 ,我描述了一个库,该库有助于处理Java中的样板代码( 是的,我知道这些问题已经在Kotlin中解决了 ,但这是现实生活,我们不能一味地坐下来,一旦出现较新或更简单的语言…

福州PHP讲师招聘_“艺”起就业|招聘信息汇总

亲爱的美术学院毕业生们在全国上下万众一心抗击新冠肺炎疫情的关键时期学院党委高度重视并时刻关注着每一位毕业生的就业工作为进一步做好疫情防控工作也为进一步确保同学们顺利求职就业保障毕业生就业工作的时效性学院公众号特别设立“艺”起就业—招聘信息发布栏目 由院学工…

哪个app最费电_关于石墨烯养生地暖,业主最关心的几大问题,答案附上!

很多人对石墨烯地暖有些许误解,不敢轻易接受。其实不然,石墨烯地暖是一种供热效果好、安全性高、运用寿命长、节能环保的新型健康采暖方式,不仅适用于住宅小区、别墅等家庭采暖,也可用于办公楼、医院等各类公共建筑采暖。在众多对…

cpu 抖动_微抖动,繁忙的等待和绑定CPU

cpu 抖动性能分析新机器 当我在新机器上工作时,我想了解它的局限性。 在这篇文章中,我将研究机器的抖动以及忙于等待本周末构建的新PC的影响。 该机器的规格很有趣,但不是发布目的。 永远不要少于它们: i7-3970X六核运行于4.5 GH…

两端分散对齐怎么设置_Word文字很难对齐?用这4个方法,2秒可对齐所有文字!...

日常工作中,我们在给Word文档进行对齐操作的时候,很多人都是猛敲空格键来对齐文字,通常是一顿操作猛如虎,仔细一看原地杵。简单的文字对齐,这种方法可能还算凑效,但稍显复杂的就不那么管用了。今天叨叨君就…

怎样学c++程序语言,如何学好 C++——学习门槛最高的编程语言

根据InfoQ 编程语言 2 月排行榜,统计发现,学习门槛最高的编程语言是 C。那么如何学好这门又难、门槛又高的语言呢?前面我们介绍过C。C是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼斯特劳斯特卢普博士在2…

首个JDK 10(18.3)发行候选版(内部版本43)展示了新的版本控制方案

Mark Reinhold的帖子“ JDK 10:First Release Candidate ”宣布“内部版本43中没有未解决的P1错误”,并将Build 43命名为最初的JDK 10版本候选 。 Reinhold帖子还指向“ JDK 10 Early Access Builds ”页面,该页面包含发行说明的链接。 到基于…

7 centos 查看程序文件数量_CentOS之使用Systemd添加自定义系统服务

文章引言Systemd 就是为了解决Linux 的启动一直采用init进程问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是…

做完c语言通讯录系统后的小结,c语言通讯录管理系统的总结

c语言通讯录管理系统的总结c语言通讯录管理系统的总结c语言课设管理系统总结完成情况防暴力输入密码加密输入并删除管理员和用户端两个端管理员对用户的账号删除注册用户用户的账户名及密码修改用户基本操作管理员基本操作存在的问题管理员无法对用户的数据进行修改未使用链表由…

因特尔显卡自定义分辨率_电脑显示器分辨率超频教程:1080P超2K分辨率的方法...

我们玩过CPU超频、显卡超频、内存超频等,相信不少用户还没有尝试过显示器超频,其实在前段时间,装机之家为广大爱好者发布了一篇【电脑显示器刷新率怎么超频?电脑显示器提高屏幕刷新率超频教程】文章,我们将一款普通60H…

Java 9示例–收集的工厂方法–创建不可修改的列表,集合和映射

大家好,这是我在该博客上发表的有关Java 9功能的第一篇文章,今天您将了解我最喜欢的功能“收集的工厂方法” ,它是JEP 269的一部分。JEP代表JDK增强建议。 如果您曾经在Groovy或Kotlin工作过,那么您就会知道使用集合文字使用元素创…

郴州郴锦机器人_减税降费宣传走进郴州市民营企业高质量发展专题培训班

红网时刻郴州8月23日讯(通讯员 陈磊 记者 欧群军)“毫不动摇支持民营经济健康发展离不开税收政策的有力支持。近年来,特别是今年以来国家系列税收优惠政策的出台,为民营经济的发展注入了新的活力。”8月22日,郴州市税务局减税降费宣讲课堂走进…

FPGA(8)--频率计检测控制系统

文章目录一、设计要求1.整体控制系统设计要求2.频率计检测设计要求二、设计思路1.确定VHDL描述与原理图相结合完成设计2.确定状态情况3.数码管显示功能三、设计内容1. 频率检测部分VHDL描述2. 七段数码管显示部分VHDL描述3. 系统主控制部分VHDL描述4.将三个部分的VHDL描述分别都…

lda进行图片分类_LDA主题模型

今天来啃硬骨头了,说说LDA主题模型。本文言简意赅,没有太多的数学公式。学习也不要太多的陷入算法的细枝末节之中,学习复杂的事物,需要从整体去把握。先列出本文的讲解顺序。什么是LDA模型2. 函数与 Beta函数3.共轭先验分布4.二项…

FPGA(1)--VHDL--6选1数据选择器

一、实验目的 掌握用VHDL语句进行组合电路设计的方法,并熟悉程序的编译、调试与波形图的仿真。 二、实验内容 分别用VHDL的CASE语句及IF语句两种方法,设计6选1数据选择器。通过编译、仿真验证功能正确性。 三、实验设计 设计的依据:教材…

android+4.4+jni闪退,native2.1 安卓退到后台时,概率闪退

赞同来自:同样的,在这个时候,还出了另一个错误,详情见下面的log,这个问题,出现的情况就和上面的不同,从5.0 - 9.0 ,level 22- level 28 ,都在出这个错误,真的搞不太清楚是为什么&…

java 模板方法设计模式_Java中的模板方法设计模式

java 模板方法设计模式模板方法是一种行为设计模式 ,用于创建方法存根并将某些实现步骤推迟到子类。 模板方法定义了执行算法的步骤,它可以提供默认实现,该实现对于所有或某些子类可能是通用的。 让我们通过一个例子来理解这种模式&#xff…