数组: 是由相同类型的元素的集合所组成的数据结构,分配一块连续的内存来存储。知道第一个元素的内存地址,加上下标(偏移量)就能找到第2或N个。
数组随机访问的速度快,增加和删除则慢(因为删除index2,后面的3-n都要往前挪一位)
链表: 非连续存储的指向型存储,随机访问的速度慢(需一层层查找),增加和删除则快(不需要挪位)
树形结构、图形结构
树形结构又指向其他树点,就是图形结构
图结构,在webpack和vite中有用到,作用是,能找出是否有文件被重复加载
堆和栈
对象是数组+链表的结构
只要是树形结构,解答基本都可以用递归解决
前段时间公司给了一个新需求就是写一个装修室内3D全景效果图,于是开始我的three.js开发之旅。作为一个前端小白,突然接触three.js&webgl除了懵逼还是懵逼,不过作为一个技术人对于挑战也许就是软件开发中真正的乐趣,至少不会埋头调试一遍又一遍重复的页面数据,上上下下左左右右BABA......简直枯燥到极点。不过three.js&webgl不得不说给我打开了新的世界,接下来我就简单讲述一下我的学习之旅。
Three.js 是一款运行在浏览器中的 3D 引擎,是JavaScript编写的WebGL第三方库,可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象,three.js内部也是webgl的封装,封装了大量了webgl API ,让比较繁琐的webgl更加简便。
WebGL(全写Web Graphics Library)是一种3D绘图协议,它让可以让开发进一步去了解图形渲染,Webgl是JavaScript和OpenGL ES 2.0合并出来的升级版,通过webgl可以让前端开发者们脱离开css渲染,可以了解更加底层的渲染,WebGL也可以为HTML5 Canvas提供硬件3D加速渲染,webgl是通过系统显卡来在浏览器里更流畅地展示3D场景和模型,加入shader(着色器)来对图形渲染,学习webgl需要具备相应的图形学算法,属于目前图形渲染开发的高级技术之一。目前webgl也运用在游戏,视频特效,包含untiy3D也是集成webgl。
three.js中主要由摄像机 ,场景 ,渲染器 , 资源加载器,素材组成
webgl中的所有东西都是基于摄像机去展示的,可以利用摄像头的视角形成对3d视图观测视角,比如鱼眼视角,从而就让我们可以在平面图上可以开发出真实场景的3D视图。接下来我们看看怎么用three.js创建一个摄像机:
摄像机有了但是为了让景物可以更好的展现,这时候我们就需要一个展示景物的场景,three.js也为我们封装好了,如下所示可以创建一个场景:
渲染器是webgl的渲染启动开关,他可以调用render方式把场景渲染到摄像机。
three.js加载资源不同我们常见的html一样,直接通过src属性加载,而是通过TextureLoader.load来加载资源。
素材常见的包含网格,灯光等许多元素下面我就举个例子
http://www.sunql.top/webgldemo/index.html
https://github.com/sunql0827/webgldemo.git
https://gitee.com/sunql-hugh/webgldemo.git
通过这次基于three.js的webgl全景图开发之旅为我对视图渲染打开了一道新的大门,不过webgl的厉害之处还有很多很多是我还未涉及到了,以后还需要更加努力了。
这是一个有趣的题目,我更为好奇的是,题中罗列一众太阳系的星星,为何没有地球呢???
不过没有关系,先给出答案:
运行结果如下:
拿星球来组合着玩儿是个新奇趣致又气势恢宏磅礴的想法,颇为值得仔细玩味。题目没有明确是需要排列,还是组合,事实上这会导致两种不同的可能性,因为在数学上“排列”和“组合”两者是有明确区别的。
依照题目所示,条件有两个:
(1) 七颗星星任意选取n个合并为1组,每种选择中至少一颗星星,最多七颗。
(2) 每组的结果不能重复。
但是——
题目没有指出是否需要“有顺序”,排列是指任意选取n个合并为一个组,不同顺序的组视为2个各不相同的组,例如:[金、木、水] 和 [金、水、木],在排列的情况下,它们是两个组,然而在组合的情况下,他们则是相同的组合。组合是指这3个星星在不同顺序下,它们只要个数相同,组中元素也相同,则认为两组是一样的,不看顺序,只论有无。它们同时存在则代表两者重复。
不论排列还是组合,我们先来计算两种方式它们各自能够合并成组的总数。
按排列公式计算7颗星星的所有组(注意不是组合)的可能性总数,假设为 A,则:
A = 7!/(7-7)! + 7!/(7-6)! + 7!/(7-5)! + 7!/(7-4)! + 7!/(7-3)! + 7!/(7-2)! + 7!/(7-1)!
= 5040 + 5040 + 2520 + 840 + 210 + 42 + 7
= 13699
以排列的方式将会产生13699种可能的组。
然而按组合公式来计算的话,可能性的组的总数将会少很多,假设组合方式的组的总数为C,则:
C = 7!/(7!*0!) + 7!/(6!*1!) + 7!/(5!*2!) + 7!/(4!*3!) + 7!/(3!*4!) + 7!/(2!*5!) + 7!/(1!*6!)
= 1 + 7 + 21 + 35+ 35 + 21 + 7
= 127
以组合的方式将会产生127种可能的组,它也正好等于 2^7 - 1,即2的7次方减1,这使人容易想到2进制编码,假设我们如下图这样看待每颗星星:
将每颗星星想象成一个位,7颗星星则有7位(如果有8位最好,刚好凑成2个字节),7位可以表达的正整数刚好是128,全部位0则代表某个组合内没有任何星星,假设空组合没有意义,所以减去1。
假设为1代表在组合中,0则不在,那么上图的组合结果就是:[日、金、木、土]
按排列的方式多达1.3万多种可能性,数量庞大,犹如置身于浩瀚而深邃、虚无而飘渺般的茫茫宇宙中使人彷徨失措。
所幸题主仅需其中的28种,当真是弱水三千,只取一瓢饮。
故此,使用组合方式可以骤然缩减组合的总数,区区百余个,使人轻松舒畅,仿佛等到黎明前漆黑的夜空中静悄悄地迎来天边的第一缕曙光。
选择是烦恼的根源,迷茫的因由。
巧之又巧,为何题主偏偏要、刚刚好、恰恰是28种组合?不偏不倚,不多不少,这让我颇费思量,为何对28这个数字这般执着?
不过后来发现,28 = 7 + 6 + 5 + 4 + 3 + 2 + 1,刚好是一个阶梯求和的结果。编写成程序仅需一个双重循环: