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绘制曲线我们…

sudo su su_Spring Security应用程序中的su和sudo

sudo su su很久以前,我从事的项目具有很强大的功能。 有两个角色:用户和主管。 主管可以以任何方式更改系统中的任何文档,而用户则更受工作流约束的限制。 当普通用户对当前正在编辑并存储在HTTP会话中的文档有疑问时,主管可以介入…

linux如何判断同名进程个数,Linux下判断是否存在多个同名进程

Linux 下如何判断同名进程的个数,这个可以通过shell命令ps -e | grep -c "所查进程名字",就可以得到进程的个数。这里给出代码实现。bool processNumber(char *name){FILE *fptr;bool bret false;char cmd[255] {\0};char buf[255] {\0};sp…

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

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

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

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

noj大作业c语言扫雷,noj大作业.doc

作业名称:算法演示程序学 院:航海学院班 级:学 号:2013300951姓 名:苏和团队组成:西北工业大学2015年11月11日1、问题与背景(描述程序所要解决的问题或应用背景)C语言经过几十年的发展已经发展出多种多样的…

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

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

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

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

双机之间的串行通信设计 c语言编程,双机串行通信设计精品.doc-资源下载人人文库网...

双机串行通信设计 精品.doc所属课程名称 单片机原理与接口技术 题 目 双机串行通信 二 总体设计2.1 设计目的 通过本次课题设计,应用单片机原理及其接口技术等所学相关知识及查阅资料,完成简易双机串行通信设计,以达到理论与实践更好的结合、…

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

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

南京邮电大学通达学院c语言实验报告,南京邮电大学通达学院c语言程序报告.docx...

南京邮电大学通达学院c语言程序报告南京邮电大学通达学院程序设计(上机)报告题 目: R015M P008E专 业 学 生 姓 名 班 级 学 号 指 导 教 师 日 期 2015年5月评 分 细 则评分项优秀良好中等及格不及格遵守机房规章制度上机表现学习态度基础知识水平程序设计能力课题…

两端分散对齐怎么设置_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…

pyinstaller安装失败解决

1.看到直接输入pip install pyinstaller 似乎很简单 2.尝试结果失败 3.其实失败有很多原因,但是有一个自我感觉通用的办法: 使用管理员身份打开cmd 输入 python -m pip install --upgrade pip 输入 pip install pywin32 输入 pip install wheel 输入 pip…

android pdu 编码规则,[转载]PDU编码规则

目前,发送短消息常用Text和PDU(Protocol DataUnit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU…