数据结构与算法(二)

news/2024/7/4 23:42:48

一、数组

什么是数组?

数组:在内存中用一串连续的区域来存放一些值。数组是相同类型数据元素的有序集合

数组是由相同类型的元素的集合组成的数据结构

连续内存:JS的数组元素可以是任意类型,JS中的内存地址是不连续的

数组的优点

  1. 按照索引查询元素的时候速度很快
  2. 存储大量的数据
  3. 按照索引去遍历数组
  4. 定义方便,访问很灵活

 

数组的缺点:

  1. 根据内容查找会很慢-index
  2. 数组的大小一经确定是不能改变的,不适合动态存储
  3. 数组只能存储相同类型的数据
  4. 增加、删除元素效率很低(尽量避免从头部插入)

清空数组有几种方法:

  • length = 0
  • = []
  • splice()

 二、栈

内存区域:栈区

单片机:压栈

数据结构中,有一个同名的结构:

内存中的堆栈和数据结构中的堆栈不是一个概念,内存中的堆栈是真实存在的物理区,数据结构中的堆栈式抽象数据存储结构

栈:是一种受限制的线性表。它遵循后进先出(LIFO)

栈的应用:十进制转二进制

 

// 十进制转化二进制
const binary = (number)=>{
	let stack = new Stack();
	let remainder = 0;
	let top = '';
	
	while(number>0){
		remainder = number%2;
		stack.push(remainder);
		number = Math.floor(number/2);
	}
	while(!stack.isEmpty()){
		top+=stack.pop();
	}
	return top;
}

 最开始的时候,栈式不含有任何数据的,叫做空栈



class Stack(){
	constructor(){
		this.items = [];
	}
	push(ele){
		this.items.push(ele);
	}
	pop(){
		return this.items.pop();
	}
	// 栈顶
	peek(){
		return this.items[this.item.length - 1]
	}
	// 判空
	isEmpty(){
		return this.items.length === 0 ;
	}
	// 长度
	size(){
		return this.items.length;
	}
	// 清空
	clear(){
		this.items.length = 0
	}
}

push():数组末尾推入

pop():数组末尾推出

javascript的调用栈(执行栈)

执行上下文:执行上下文就是当前JS代码被解析和执行所在环境的抽象的概念

JS中的任何代码都是在执行上下文中运行的。(执行环境)

JS的执行上下文分三种:全局执行上下文、函数执行上下文、Eval

  • 全局执行上下文:默认的,它是最基础的执行上下文。
  1. 创建全局对象
  2. 将this指向这个全局对象
  3. 执行js的时候就压入栈底,关闭浏览器的时候才弹出
  • 函数执行上下文:每次调用函数的时候,会为这个函数创建一个新的执行上下文。
  1. JS引擎创建一个新的全局执行上下文并且将这个执行上下文推入到当前的执行栈中(执行栈用于:存储在代码执行期间创建的所有的执行上下文)
  2. 每当发生函数调用的时候,JS引擎都会为该函数创建一个新的执行上下文并且PUSH到当前执行栈的栈顶
  • Eval函数执行上下文

 JS的执行上下文分两个阶段

  • 创建阶段
  1. 创建词法环境
  2. 生成变量对象(VO),建立作用域链作用域链作用域链(重要的事说三遍);函数环境会创建变量对象:arguments对象(并赋值)、函数声明(并赋值)、变量声明(不赋值),函数表达式声明(不赋值);会确定this指向;会确定作用域
  3. 确认this指向,并绑定this
  • 执行阶段。这个阶段进行变量赋值,函数引用及执行代码。变量赋值、函数表达式赋值,使变量对象编程活跃对象

递归的原理

函数的调用的本质:“压栈与出栈操作”。函数在在调用栈里边有一个特例,叫做递归

递归:自己调自己

递归调用,递归栈。LIFO

先进栈,到条件后再出栈,如果不出栈,就会导致:栈溢出

 阶乘:1到n到连续自然数相乘的积

 

const factor = (n)=>{
        if(n===1){
            return 1;
        }
     return n*factor(n-1);

    }

斐波那契数列:从第3项开始,每一项都等于前两项的和 

一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?

1,1,2,3,5,8,13...

F(1) = 1,F(2) = 1 ...

F(n) = F(n-1)+F(n-2)

const Fibonacci = (n) => {
  if (n <= 1) {
    return 1;
  }
  return Fibonacci(n - 1) + Fibonacci(n - 2);
};

尾调用优化以上两个算法:

//  把前面两位数,当作参数传进来
const Fibonacci = (n, ac1 = 1, ac2 = 1) => {
  if (n <= 1) {
    return ac2;
  }

  return Fibonacci(n - 1, ac2, ac1 + ac2);
};

/* 
重复计算的问题
n = 5 ,Fibonacci(4)+Fibonacci(3)
n = 4,Fibonacci(3)+Fibonacci(2)
...
递归需要同时保存成百上千个调用帧。很容易就会发生栈溢出
但是对于尾递归来说。由于只存在一个调用栈,所以永远不会发生栈溢出错误
Fibonacci(50)
*/

const factor = (n,total) =>{
  if (n === 1) {
    return total;
  }
  return factor(n-1, n * total)
}

// 初始值
console.log(factor(10,1));


http://lihuaxi.xjx100.cn/news/1142782.html

相关文章

用两分钟教会你在领英Linkedin实现一天几个询盘

如果有兄弟还只会在展会、邮箱这些传统渠道开发客户的话&#xff0c;今天这篇文章你就要好好读一下了。最近几年&#xff0c;是社交媒体营销比较火爆的时候&#xff0c;很多跨境人都开始了社交化主动式去开发客户。而领英作为目前全球用户总计超过8亿&#xff0c;覆盖了200多个…

mongodb设置用户名和密码

docker run --name mongodb -p 27017:27017 -v /opt/mongodb/data:/data/db -v /opt/mongodb/backup:/data/backup -d mongo --auth进入容器&#xff1a; docker -it exec 容器id /bin/bash进入mongo的控制台 mongosh设置用户名及密码 use admin db.createUser({ user: &…

一文理解Kafka

概述 Kafka是一个基于Zookeeper的分布式消息中间件&#xff0c;支持消息分区&#xff0c;提供发布和订阅功能。使用Scala编写&#xff0c;主要特点是可水平扩展&#xff0c;高吞吐率以及高并发。 常见的使用场景&#xff1a; 企业级别活动数据和运营数据的消息传递&am…

postgresql流复制同异步分析

postgresql流复制同异步分析 postgresql流复制主要是四个进程的交互。 postgres&#xff08;backend进程&#xff09;&#xff08;主节点&#xff09; 接受客户端的请求&#xff0c;并通过共享内存等待walsender唤醒。 walsender&#xff08;主节点&#xff09; 向walreceive…

AI绘画-Midjourney基础2-超强二次元风格模型 niji 5

niji 模型是 mj 的一种模型,可以生成二次元风格的图片。 在控制台输入 /settings 指令,进入设置页面。 选择第二行的 Niji version 5 模型,就可以创作二次元风格的图片了! 一、expressive 风格 expressive 风格是 niji 5 模型的默认风格。 Step into the world :: of a …

flask 添加markdown支持

flask 添加markdown支持 flask blog 演示项目 Documentation https://flask.palletsprojects.com/tutorial/ 源码 https://github.com/pallets/flask/tree/main/examples/tutorial 利用 editor.md 开源库 https://github.com/pandao/editor.md 下载 重命名为 editormd 放…

HBuilder开发uniapp添加android的模拟器的方法

我们知道使用uniapp开发多端app非常方便&#xff0c;开发过程中的模拟器也可以提高我们测试代码的效率。但我们按uniapp官网的方法&#xff0c;上google的官网下载模拟器&#xff0c;往往非常不方便。 下面我们来看一下使用其他模拟器的方法。 我们知道android开发中&#xf…

虹科新品 | 高可靠性、可适用于高磁/压的线性传感器!

PART 1 什么是线性传感器&#xff1f; 基本上&#xff0c;线性传感器是一种用于测量位移和距离的设备&#xff0c;具有高可靠性。测量网格通过光学传感器移动测量数据&#xff0c;数据被光学记录并通过控制器转换为电气数据&#xff0c;而控制器又可以转换为路径。 因此&…