JavaScript数据结构&设计模式&算法
文章平均质量分 78
奋飛
乐观、勇气、专注、果断、好奇、公正、慎思、真诚、追求极致追求完美、诚信!独立撰写了多个前端专题模块,访问量达百万级。多次负责组织大数据可视化前端架构平台开发工作。对前端新技术、新潮流具有很强的敏锐力和洞察力!
展开
-
LFU -- Javascript实现版本
LFU(Least Frequently Used)LFU 最近最不常用,是一种常见的淘汰(置换)算法,选择最近使用次数最少的予以淘汰。常用于内存管理。对每个块进行引用计数,当缓存达到容量上限并有新的模块插入时,系统将搜索具有最低计数的块删除。算法实现:双向链表 + 哈希表节点:Node {key, value, freq, pre, post}key、valuefreq:使用频率, 删除时使用pre、post: 前置及后置节点,插入使用双向链表:DualLinkedList原创 2021-10-24 20:06:46 · 674 阅读 · 0 评论 -
LRU -- Javascript实现版本(核心代码只有10行)
LRU(Least Recently Used)LRU 最近最少使用,是一种常见的淘汰(置换)算法,选择最近最久未使用的予以淘汰。常用于内存管理。浏览器 IndexedDB 达到存储上限后,自动清理采用的策略正是 LRU。当可用磁盘空间已满时,配额管理器将根据LRU策略开始清除数据——最近最少使用的源将首先被删除,然后是下一个,直到浏览器不再超过限制。我们使用临时存储跟踪每个源的“上次访问时间”。 一旦达到临时存储的全局限制(之后会有更多限制),我们将尝试查找所有当前未使用的源(即没有打开选项卡原创 2021-10-11 19:14:19 · 630 阅读 · 0 评论 -
算法--基础
学习算法设计的重点就是把人类找到的求解问题的方法、步骤以过程化、形式化、机械化的形式表示出来,以便让计算机执行。算法概述定义算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。要素算法由操作、控制结构、数据结构3要素组成。操作类型说明算术运算加、减、乘、除关系比较大于...原创 2018-10-17 19:06:55 · 1874 阅读 · 2 评论 -
算法--枚举法
枚举法枚举(Enumuerate)是蛮力策略的一种表现,最普遍的思维方式。它根据问题中的条件将可能的情况一一列举出来,逐一尝试从中找到满足问题条件的解。找出枚举范围找出约束条件优点: 算法简单,在局部地方使用枚举法,效果十分的好缺点: 运算量过大,当问题的规模变大的时候,循环的阶数越大,执行速度越慢示例: 百钱百鸡问题我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱...原创 2018-10-28 16:25:13 · 1431 阅读 · 0 评论 -
算法--迭代法
迭代法迭代法(Iteration)是一种不断用变量的旧值递推出新值的解决问题的方法。迭代算法是用计算机解决问题的一种基本方法,一般用于数值计算。累加、累乘都是迭代算法的基础应用。典型案例:牛顿迭代法”。步骤:确定迭代模型:分析得出前一个(或几个)值与其下一个值的迭代关系数学模型;建立迭代关系式对迭代过程进行控制经典案例:示例: 斐波那契数列:1、1、2、3、5、8、13、21、3...原创 2018-10-24 18:52:32 · 45224 阅读 · 0 评论 -
算法--递归
递归函数直接或间接调用函数本身。递归是一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数。它解决问题的各个小部分,直到解决最初的大问题。在有限次(必须有出口)可预见性结果中,找到结果与上一次结果之间的关系;关键在于梳理清楚本次结果和上一次结果的关系有哪些方面或是因素;在算法的分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化...原创 2018-11-05 21:55:27 · 1344 阅读 · 0 评论 -
算法--分治算法
分治算法分而治之,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。如:二分法、快速排序、归并排序,二叉树遍历(先遍历左子树再遍历右子树)等。步骤:分解:将原有问题分解为若干规模较小,相对独立,与原问题形式相同的子问题;解决:若子问题容易解决,则直接解;否则继续分解为更小的子问题,直到容易解决...原创 2018-11-08 19:08:01 · 519 阅读 · 0 评论 -
JavaScript算法-排序算法
该文主要讲述基本排序算法:冒泡排序,选择排序,插入排序;高级排序算法:希尔排序,归并排序,快速排序的算法实现(JavaScript)和相同数据下的运行时间对比。原创 2017-03-29 10:22:30 · 2551 阅读 · 5 评论 -
JavaScript数据结构-树
我觉得这社会上,也不差钱好多人,可能好多人也不差权力,但是我觉得能得到这种满足的也不多。 –郭小平<临汾红丝带学校校长> 树是计算机科学中经常用到的一种数据结构。树是一种非线性的数据结构,以分层的方式存储数据。是被用来存储具有层级关系或有序的数据,比如文件系统中的文件。 二叉树二叉树,每个节点最多有两个子树的树结构。二叉树是一种特殊的树,也是一个连通的无环图。 二叉查找树 二叉查原创 2017-03-24 10:12:42 · 3634 阅读 · 4 评论 -
JavaScript数据结构-集合
集合(set)是一种包含不同元素的数据结构。集合中的元素称为成员。集合具有两个重要特性: (1)集合中的成员是无序的 (2)集合中不允许相同成员存在 当想创建一个数据结构,用来保存一些独一无二的元素时,比如一段文本中用到的单词,集合就变得非常有用。一、集合的定义、操作和属性集合是由一组无序但彼此之间有一定相关性的成员构成的,每个成员在集合中只能出现一次。在数学上,用大括号将一组成员括原创 2016-11-06 15:41:57 · 3704 阅读 · 0 评论 -
JavaScript数据结构-字典
字典是一种以“键–值”对形式存储数据的数据结构。就像电话薄里的名字和号码一样。JavaScript的Object类就是以字典的形式设计的。一、字典类字典类(Dictionary)基于Object。在《数据结构与算法JavaScript描述》书中“字典”采用了数组存储数据,不仅让阅读者很难理解,而且也没有实现便捷性,反而其中的代码逻辑是错误的,不能按照设计的方式正确输出结果!!!/** * 构造函原创 2016-11-06 23:02:20 · 6869 阅读 · 1 评论 -
定时任务高效触发
圆通处事,方能达到目的!开发中我们经常会遇到一些需要定时来解决的业务场景。比如,有这样一个需求:“如果连续30s没有请求包(例如登录,消息,keepalive包),服务端就要将这个用户的状态置为离线”。轮询处理、定时处理、环形队列处理。原创 2017-06-04 15:44:22 · 6006 阅读 · 3 评论 -
JavaScript设计模式--状态模式
状态模式的关键是区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变。 当电灯开着,此时按下开关,电灯会切换到关闭状态;再按一次开关,电灯又将被打开。同一个开关在不同的状态下,表现出来的行为是不一样的。一、有限状态机状态总数(state)是有限的。任一时刻,只处在一种状态之中。某种条件下,会从一种状态转变(transition)到另一种状态。允许一个对象在其内部状态改变时改变原创 2015-12-20 19:58:04 · 4304 阅读 · 5 评论 -
JavaScript设计模式--观察者模式
一、定义观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式。 好处: (1)可广泛应用于异步编程中,是一种替代传递回调函数的方案。 (2)可取代对象之间硬编码的通知机制,一个对象不用再显示地调用另外一个对象的某个接口。两对象轻松解耦。二、DOM事件–观察原创 2015-12-20 19:22:57 · 7380 阅读 · 7 评论 -
JavaScript设计模式--策略模式
把不变的部分和变化的部分隔开是每个设计模式的主题。条条大路通罗马。我们经常会遇到解决一件事情有多种方案,比如压缩文件,我们可以使用zip算法、也可以使用gzip算法。其灵活多样,我们可以采用策略模式解决。一、定义定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 基于策略类模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环原创 2015-12-20 18:58:26 · 1914 阅读 · 0 评论 -
JavaScript设计模式--单例模式
一、定义保证一个类仅有一个实例,并提供一个访问它的全局访问点。当单击登陆按钮,页面中出现一个登陆浮窗,这个登陆浮窗是唯一的,无论单击多少次登陆按钮,这个浮窗都只会被创建一次,那么这个登陆浮窗就适合用单例模式来创建。二、实现原理要实现单例并不复杂,使用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。三、假单例全局变量不是单例模式,但在JavaS原创 2015-12-20 18:52:34 · 2166 阅读 · 0 评论 -
JavaScript设计模式--代理模式
明星都有经纪人作为代理。如果请明星办一场商演,只能联系其经纪人,经纪人会把商演的细节和报酬谈好,再把合同交给明星签。一、定义代理模式:为一个对象提供一个代用品或占位符,以便控制对它的访问。代理分为:保护代理和虚拟代理 保护代理:用于控制不同权限的对象对目标对象的访问,在JavaScript中很难判断谁访问了某个对象,所以保护代理很难实现。二、图片预加载(最常见的虚拟代理应用场景)图片预加载是一种常原创 2015-12-20 19:10:04 · 1808 阅读 · 0 评论 -
JavaScript设计模式--迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 JavaScript中的Array.prototype.forEach一、jQuery中的迭代器$.each([1, 2, 3], function(i, n) { console.log("当前下标为:"+ i + " 当前元素为:"+ n );});二、实现自己的迭代器var each =原创 2015-12-20 19:16:55 · 2168 阅读 · 0 评论 -
JavaScript设计模式--模板方法模式
一、定义模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类 模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。二、示例Coffee or Tea (1) 把水煮沸 (2) 用沸水浸泡茶叶 (3) 把茶水倒进杯子 (4) 加柠檬/* 抽象父类:饮料 */var Beverage = function(){};// (1) 把水煮沸原创 2015-12-20 19:29:32 · 2187 阅读 · 2 评论 -
JavaScript设计模式--享元模式
一、定义享元(flyweight)模式是一种用于性能优化的模式,核心是运用共享技术来有效支持大量细刻度的对象。 在JavaScript中,浏览器特别是移动端的浏览器分配的内存并不算多,如何节省内存就成了一个非常有意义的事情。 享元模式是一种用时间换空间的优化模式 内衣工厂有100种男士内衣、100中女士内衣,要求给每种内衣拍照。如果不使用享元模式则需要200个塑料模特;使用享元模式,只需要男原创 2015-12-20 19:34:47 · 2082 阅读 · 3 评论 -
JavaScript设计模式--责任链模式
一、定义责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。二、示例 假设这么一个场景: 我们负责一个售卖手机的电商网站,经过分别缴纳500元定金和200元定金的两轮预定后,到了正式购买阶段。针对预定用户实行优惠,支付过500元定金的用户会收到100元的商城优惠券,支付过200元定金的用原创 2015-12-20 19:40:08 · 3150 阅读 · 0 评论 -
JavaScript设计模式--中介者模式
一、定义面向对象设计鼓励将行为分布到各个对象中,把对象划分成更小的粒度,有助于增强对象的可复用性。但由于这些细粒度对象之间的联系激增,又可能反过来降低它们的可复用性。 中介者模式的作用就是解除对象与对象之间的紧耦合关系。二、示例:购买商品 假设我们正在开发一个购买手机的页面,购买流程中,可以选择手机颜色以及输入购买数量,同时页面中可以对应展示输入内容。还有一个按钮动态显示下一步操作(该颜色库存原创 2015-12-20 19:45:32 · 1957 阅读 · 2 评论 -
JavaScript设计模式--装饰者模式
有时我们不希望某个类天生就非常庞大,一次性包含许多职责。那么我们就可以使用装饰着模式。 装饰着模式可以动态地给某个对象添加一些额外的职责,从而不影响这个类中派生的其他对象。 装饰着模式将一个对象嵌入另一个对象之中,实际上相当于这个对象被另一个对象包装起来,形成一条包装链。一、不改动原函数的情况下,给该函数添加些额外的功能1. 保存原引用window.onload = function() {原创 2015-12-20 19:50:10 · 2087 阅读 · 0 评论 -
JavaScript设计模式--前奏
最近阅读了《JavaScript设计模式与开发实践》(2015年度最佳推荐),收获颇多,自己对设计模式有了全新的了解和认识。在项目实践中也用到了一些,感觉很不错。 设计模式应遵守的原则: (1)最少知识原则:一个软件实体应当尽可能少地与其他实体发生相互作用(把对象划分成较小的粒度,以便提高复用性) (2)开放-封闭原则:软件实体(类、模块、函数)等应该是可以扩展的,但是不可修改。一、原型模式J原创 2015-12-20 18:38:34 · 1845 阅读 · 0 评论