数据结构与算法(四)

news2024/10/1 19:29:50

一、链表

线性表:0个或者是多个数据元素有限序列

物理的存储结构:

  1. 顺序存储:用一段连续的存储单元依次存储线性表的数据元素。
  2. 链式存储:内存地址可以是连续的,也可以是不连续的。把数据元素存放在任意的存储单元里,指针来存放数据元素的地址

JS数组不是真正意义上的数组,JS的数组并不是存在一段连续的内存中 

 数组:在大多数的语言中,虽然数组查询很快,但是数组的大小是固定,从数组的起点或者是中间插入或者移除元素的,成本其实很高,因为需要移动元素,尤其当内存不足重新申请更大内存时,数据拷贝的代价很大。

所以 。。链表来了

链表中的元素在内存中不必是连续的空间

链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称为指针或者链接)组成

结论:

  • 插入删除:链表的性能好:链表没有大小限制,支持动态扩容,但是因为链表的每个结点都需要存储前驱/后驱结点的指针,内存消耗会翻倍。
  • 查询修改:数组性能好
// 结点类
class Node {
	constructor(element) {
		this.element = element;
		this.next = null;
	}
}
// 链表
class LinkList {
	constructor() {
		// 头部
		this.head = null;
		// 链表长度
		this.length = 0;
	}
	// 1、链表尾部追加元素
	append(element) {
		// 创建结点
		let node = new Node(element);
		// 如果说链表为空
		if (this.length === 0) {
			this.head = node;
		} else {
			// 通过head找到后面的结点
			let current = this.head;
			// 遍历
			while (current.next) {
				current = current.next;
			}
			// while 执行完毕以后,current变成最后一个节点
			current.next = node;
		}
		// length增加
		this.length += 1;
	}
	// 2、获取链表头部
	getHead() {
		return this.head;
	}
	// 3、toString方法
	toString() {
		let current = this.head;
		console.log(current)
		let linkString = '';
		while (current) {
			linkString += ',' + current.element.element;
			current = current.next;
		}
		// 从第一个位置开始
		return linkString.slice(1);
	}
	// 在任意位置插入元素
	insert(element, position) {
		// 位置不能是负数
		if(position < 0 || position > this.length)  {
			return false
		}
		let index = 0;
		let current = this.head;
		// 上一个结点
		let provious = null;
		// 创建元素
		let node = new Node(element);
		// 判断插入的是不是第一个
		if (position === 0) {
			node.next = this.head;
			this.head = node;
		} else {
			while (index < position) {
				provious = current;
				current = current.next;
				index++;
			}
			node.next = current;
			provious.next = node;
		}
		// 长度加一
		this.length += 1;
	}
	// get获取对应位置的元素
	get(position) {
		// 越界判断
		if (position < 0 || position > this.length) {
			return null
		}
		// 获取对应的结点
		let current = this.head;
		let index = 0;
		while (index < position) {
			current = current.next;
			index++;
		}
		return current.element
	}
	// 根据元素位置删除结点
	removeAt(position){
		// 越界判断
		if (position < 0 || position > this.length) {
			return null
		}
		// 定义一个变量,保存信息
		let index = 0;
		let current = this.head;
		let provious = null;
		// 判断是否是第一个结点
		if(position === 0){
			this.head  =  this.head.next;
		}else{
			while(index<position){
				provious =  current;
				current = current.next;
				index++;
			}
			provious.next = current.next;
		}
		// 长度减一
		this.length--;
		// 返回移除元素
		return current.element;
	}
}
// [1,5,4,4] ->,1,5,4,4->[',','object']
const n = new Node('我是小白855');
const ll = new  LinkList();

ll.append(n)
console.log(ll.toString())

二、JS原型链

JS是基于对象设计和开发出来的语言 ;

面向对象有三大特点:(封装、继承于多态);

“基于对象”是使用对象,但是我们无法利用现有的对象模板去产生新的对象类型,继而去产生一个新的对象,也就是说"基于对象"是没有继承的特点。但是面向对象对象实现了继承和多态,基于现象是没有实现这些的 .

oop面向对象的支持两种继承方式:接口继承、实现继承

ECMAscript 是无法去实现去接口继承的,JS只支持实现继承。实现继承主要依靠原型链去实现

 

prototype和 __proto__

  1. 所有的引用类型(数组、函数、对象)可以自由的扩展属性(null除外)
  2. 所有的引用类型都有一个 --proto--属性(隐式原型,它其实就是一个普通的对象)
  3. 所有的函数都有一个prototype 属性(显式原型,它也是一个普通的对象)
  4. 所有的引用类型,它的--proto--属性指向它的构造函数的prototype属性
  5. 当视图得到一个对象的属性时,如果这个对象的本身不存在这个属性,那么就会去它的--proto--属性中寻找(去它的构造函数的prototype属性)中寻找
function Person(name,age){
	this.name = name;
	this.age = age;
	this.text = function(){
		console.log(`name:${this.name},age:${this.age}`)
	}
}
// 通过原型添加方法,原型给所有对象添加属性或者方法
Person.prototype.show = function(){
	console.log('原型链里的方法')
}
/*
Person是一个普通函数,它作用是构造对象
1、通过工厂方式去构造,里面方法存在问题,容易导致全局作用域污染,数据不安全且容易被覆盖
通过工厂方式:(例子:this.text)去构造对象的时候会浪费资源
2、原型链的方法:prototype
*/ 
var xiaobai = new Person('小白',26)
var xiaoxiaobai = new Person('小小白',16)
console.log(xiaobai.text === xiaoxiaobai.text); //false
console.log(xiaobai.show === xiaoxiaobai.show) //true

再看下面这个Person函数:

function Person(name,age){
	this.name = name;
	this.age = age;
}
Object.prototype.show = function(){
	console.log('原型链里的方法')
}
var xiaobai = new Person('小白',26)
xiaobai.show()

xiaobai的构造函数是Person,所有的引用类型它的__proto__属性指向它的构造函数prototype属性; Person.prototype.是一个普通的对象,它的构造函数是Object,相当于:

var Person = new Object();

Person.name = '小白';

Person.age='26';

当调用这个对象本身并不存在的属性或者是方法时,它会一层层地往上找,一直找到null为止,null表示空的对象 { } 

原型链的继承

function Person(name,age){
	this.name = name;
	this.age = age;
    this.show = function(){
	    console.log('原型链里的方法')
    }
}
function Xiaobai(){}
// xiaobai通过Xiaobai()继承Person中show方法
Xiaobai.prototype = new Person('小白',26)
var xiaobai = new Xiaobai()
xiaobai.show()

 

原型链机制:利用原型让一个引用类型继承另外一个引用类型的属性和方法 

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

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

相关文章

寻找人工智能工具?警惕散布红线恶意软件的流氓网站

针对OpenAI ChatGPT和Midjourney等生成式人工智能服务的恶意谷歌搜索广告被用来将用户引导到一些粗糙的网站&#xff0c;这是BATLOADER活动的一部分&#xff0c;旨在传播红线窃取软件。 eSentire在一份分析报告中表示:“这两种人工智能服务都非常受欢迎&#xff0c;但缺乏第一…

Windows环境下pcl点云库 安装配置教程

本文为Windows配置点云库pcl步骤&#xff0c;具体win10、visual studio 2017、pcl1.11.1。 【1】下载安装包 Releases PointCloudLibrary/pcl GitHub 其中&#xff0c;AllInOne是一个包含了PCL库所有模块的单独下载包&#xff0c;方便快速获取整个PCL库&#xff0c;而pdb则…

【腾讯云 Finops Crane 开发者集训营】浅谈Crane的核心概念和原理

一、Crane是什么&#xff1f; FinOps&#xff08;Financial Operations&#xff09;是一种管理云计算成本的方法&#xff0c;它强调将云计算资源的成本与使用情况及业务需求相匹配&#xff0c;从而提高企业的效率和效益。在当前云计算环境下&#xff0c;FinOps已经成为了越来越…

如何理解工业互联网与智能制造,怎么共建智慧工厂?

第六届数字中国建设峰会26日在福州开幕&#xff0c;在这个数字化新技术的变革风口&#xff0c;企业如何把握机遇&#xff0c;借工业互联网和智能制造实现智慧工厂建设&#xff1f; 探讨三个问题&#xff1a; 什么是工业互联网、智能制造、智慧工厂&#xff1b;它们三者之间的…

Vm2沙箱逃逸漏洞复现(CVE-2023-32314)

0x01 产品简介 Node.js Node.js 是一个基于 V8 引擎的开源、跨平台的 JavaScript 运行环境&#xff0c;它可以在多个操作系统上运行&#xff0c;包括 Windows、macOS 和 Linux 等。Node.js 提供了一个运行在服务器端的 JavaScript 环境&#xff0c;使得开发者可以编写并发的、…

Flask框架总结

python的web框架 Flask 参考: https://dormousehole.readthedocs.io/en/2.1.2/tutorial/factory.html 一、启动脚本 随便编写一个py文件,如test.py from flask import Flaskapp Flask(__name__)app.route("/") def hello_world():return "<p>Hello Fla…

SpringBoot开发实用篇1

一、热部署 1.手工启动热部署 经过测试当前是没有启动热部署的&#xff1a; 再将sout的信息多复制几份&#xff0c;刷新功能&#xff0c;发现控制台还是只打印一行信息。说明当前热部署是没有生效的。 手动开启热部署&#xff1a; 在pom.xml文件中加入开发者工具配置热部署…

springBoot-Mybatis-Plus 多数据源切换实现

前言&#xff1a;本文主要通过AbstractRoutingDataSource&#xff0c;实现根据 http 访问携带的标识动态切换数据源&#xff1b; 1 AbstractRoutingDataSource 介绍&#xff1a; AbstractRoutingDataSource 是 Spring 框架中的一个抽象类&#xff0c;它可以用来实现动态数据源…

2023年数据分析的就业薪资水平情况

2023年数据分析的就业薪资水平情况 数据已经成为我们工作生活不可缺少的一部分&#xff0c;也成为企业提高竞争力的有效支撑。随着越来越的企业进行数字化转型&#xff0c;对于数据的需求也将越来越大&#xff0c;那么对于正在学习数据分析或者想学习数据分析的小伙伴来说&…

浅析基于AI视频智能识别技术的医疗废弃物智能监管及风险预警方案

一、方案背景 医疗废弃物含有大量的细菌、病毒、化学污染物等&#xff0c;若是回收处置不当、工作人员防护不到位等&#xff0c;会严重影响公众及个人的健康及周围环境。 对医疗废弃物的规范管理&#xff0c;也成为医疗废弃物处置行业的重要一环。传统视频监控方案主要依靠监…

漏电保护插座插排真的有用吗?同为科技(TOWE)漏保系列PDU产品

所谓漏电保护&#xff0c;是指当电气设备绝缘发生故障&#xff0c;电线和地之间、线路和线路之间、工作回路与不能带电的金属壳体形成电流通路&#xff0c;叫做漏电&#xff1b;为预防漏电对人体造成伤害&#xff0c;就产生了各种漏电保护装置&#xff0c;当电路中的漏电流超过…

数字孪生:双碳目标推动下的汽车动力电池发展

据中汽协统计&#xff0c;2022年我国新能源汽车持续爆发式增长&#xff0c;销量超680万辆&#xff0c;已连续8年位居世界第一&#xff0c;保持“快车道”发展态势&#xff0c;引起西方发达国家的高度重视。相当一部分国家以产品全生命周期碳排放为基础&#xff0c;试图建立新的…

一文带你了解移动入库指南(详细版)

​ 移动入库认证周期&#xff1a; 常规为 4-6 周 中国移动是一家基于 GSM、TD-LTE、FDD-LTE 制式网络的移动通信运营商。日前已建成 5G 基站近 39 万个&#xff0c;并且全面推动 SA 网络&#xff0c;同时和中国广电共同发展 5G 网络。作为全球 5G 网络覆盖广、用户规模大的通信…

Q1业绩整体回暖,影视行业找到增长新路径

凛冬已过&#xff0c;影视行业恢复了生机。 数据显示&#xff0c;今年一季度&#xff0c;影视院线板块全部上市公司分别实现营收、归母净利111.86亿元、10.15亿元&#xff0c;同比增幅为1.44%和53.76%。在经济复苏的背景下&#xff0c;影视行业实现了扭亏为盈和跨越式增长。 …

Fiddler抓包丨最常用功能实战演练

目录 一. 停止抓包 二. 清空会话窗 三. 过滤请求 只显示目标请求 只抓取目标端的请求 四. 解码 五. 设置断点 伪造客户端请求 伪造服务器响应 注意事项 六. 总结 结语 通过上一篇文章Fiddler移动端抓包&#xff0c;我们知道了Fiddler抓包原理以及怎样进行移动端抓包…

虎牙直播在微服务改造的实践总结

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

一文快速了解浏览器Sui Explorer

Sui作为一条基于第一原理重新设计和构建而成的L1公链&#xff0c;所有区块和交易信息皆公开透明&#xff0c;每个人都能自行查看。通过Sui链上浏览器&#xff0c;用户可以迅速了解链上的交易情况&#xff0c;比如当前的TPS和Gas价格&#xff0c;也可以使用Digest来查看特定交易…

工厂安灯呼叫系统解决方案

在选择安灯呼叫系统之前&#xff0c;需要先了解自己的需求。不同的工厂可能有不同的需求&#xff0c;例如生产线的规模、生产过程中可能会出现的问题等。因此&#xff0c;选择安灯呼叫系统之前&#xff0c;需要先考虑自己的需求&#xff0c;以便选择到最适合自己的系统。要从多…

三十九、分布式事务、seata、

1、事务 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列SQL操作&#xff0c;这些操作作为一个整体一起向系统提交&#xff0c;要么都执行、要么都不执行。 1.1 ACID事务的特点 原子性: 一致性&#xff1a;隔离性持久性 1.2 事务并发带来的问题 脏读 幻读 不可重复读 …

Mongodb Shell 常用操作命令

目录 一、启动与关闭mongodb服务 二、进入shell操作 三、常用shell命令 一、启动与关闭mongodb服务 启动:命令: ./mongod -config ../data/mongodb.conf 关闭命令: ./mongod -config ../data/mongodb.conf -shutdown 二、进入shell操作 命令:./mongo 三、常用shell命令 sh…