数组

常见的线性结构

懵懂的女人 提交于 2020-03-29 08:58:51
目录 前言 数组 数组介绍 自定义数组 实现数组的增删改查方法 动态数组 时间复杂度分析 栈 栈介绍 定义栈接口 基于数组实现栈的基本操作 使用栈实现“括号匹配”问题 队列 队列介绍 定义队列接口 数组队列 循环队列 数组队列和循环队列的性能比较 链表:最基础的动态数据结构 链表介绍 实现链表的增删改查操作 通过自定义链表实现栈 通过自定义链表实现队列 递归 前言   本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间复杂度分析,对不同的实现进行比较和优化,即侧重于代码实现。由于数据结构是实践性比较强的一个科目,希望大家在看这篇博客时,自己也去写一下代码,看一下运行结果是不是自己想要的,我也会贴出我的运行结果来进行分析。 数组 数组介绍   数组是在内存中存储相同数据类型的连续的空间,最大的优点:查询快速。   数组最好应用于“索引有语意”的情况,例如索引代表学生学号,我们可以根据学号获取这个学生对象的信息。但并非所有有语意的索引都适用于数组,例如身份证号,我们不可能拿身份证号作为索引,因为身份证长度是18位数,而且身份证号也不是连续的,这样会浪费很大的内存空间。   数组也可以处理“索引没有语意”的情况,若索引没有语意时,如何表示没有元素?我们应该如何去添加元素、如何去删除元素呢?为了解决这些问题

numpy 基础知识

只愿长相守 提交于 2020-03-29 08:57:44
numpy的主要对象是同质的多维数组。其中的元素通常都是数字,并且是同样的类型,由一个正整数元组进行索引。每个元素在内存中占有同样大小的空间。在Numpy中,维度被称为‘轴’。 例如对于 [1, 2, 1] 我们说它有一个轴,并且长度为3。而 [[ 1., 0., 0.], [ 0., 1., 2.]] 则有两个轴,第一个轴的长度为2,第二个轴的长度为3。 numpy数组类的名字叫做ndarray,经常简称为array。要注意将numpy.array与标准Python库中的array.array区分开,后者只处理一维数组,并且功能简单。 np.array的代码定义如下: numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0) 各参数的含义:   object:用于生成数组的数据对象   dtype:指定类型,可选。   copy:可选,默认为True,对象被复制。   order:C语言风格(按行)、FORTRAN风格(按列)或A(任意,默认)。   subok:默认情况下,返回的数组被强制为基类数组。 如果为True,则返回子类。   ndmin:指定返回数组的最小维数。 ndarray具有以下重要属性:   ndarray.ndim:数组的轴数量  

C++常用字符串函数使用整理

一世执手 提交于 2020-03-29 00:57:07
strlen(字符数组) 功能:求字符串长度。 说明:该函数的实参可以是字符数组名,也可以是字符串。 使用样例: char s1[80] = "China"; cout<<strlen(s1)<<'\n';      //输出结果为5 cout<<strlen("大学生")<<'\n';   //输出结果为6  结果说明:一个汉字有两个字节,所以strlen("大学生")的结果为6。 strcpy(字符数组1,字符数组2) 功能:将字符数组2中的字符串复制到字符数组1中 说明: (1)字符数组1的长度必须大于等于字符数组2的长度。 (2)复制时连同字符串后面的'\0'一起复制到字符数组1中。 (3)不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。 (4)字符数组的复制只能用strcpy函数处理。用一个赋值语句只能将一个字符赋给一个字符型变量或字符型数组元素。但可以在定义的时候初始化。 如以下形式: str1 ={''Good"};    //不合法 str1 = str2;      //不合法 char a[5],c1,c2; c1 = 'A'; c2 = 'B';    //合法 c[0] = 'C';       //合法 char g[20] = "aaaa''   //合法 使用样例: `char a[20]="aaaaaa",b[20]="bbb";`

ES6-数组的扩展

早过忘川 提交于 2020-03-28 22:59:19
扩展运算符 扩展运算符 ... 和rest功能相反,用来将一个数组转换为用逗号分隔的参数序列 function add(x, y) { return x + y; } const numbers = [4, 38]; add(...numbers) // 42 1、Array.from() Array.from() 方法可以将两类对象转化成真正的数组 类数组对象:常见的类数组对象主要是DOM操作返回的NodeList集合和函数内部的arguments对象 可遍历对象:部署了Iterator接口的数据结构 Array.of() Array.of() 方法用于将一组值,转换成数组;用来弥补 Array() 不足 Array.of(3, 11, 8) // [3,11,8] Array.of(3) // [3] Array.of(3).length // 1 Array() // [] Array(3) // [, , ,] Array(3, 11, 8) // [3, 11, 8] 只有当Array拥有至少两个参数时才会返回一个数组。 2、find()和findIndex() find() 方法用于找出第一个符合条件的数组成员,并返回该成员;参数应该是一个回调函数。 findIndex() 方法返回数组中第一个符合条件的成员的位置(index)如果没有则返回 -1 3

数据结构,算法及线性表总结

て烟熏妆下的殇ゞ 提交于 2020-03-28 20:44:20
1.思维导图 2.重要概念笔记 1.数据结构 1.数据结构定义 -我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对元素进行排序等)而执行的相应操作,这个相应的操作也叫算法。 2.算法 -衡量算法的标准: -时间复杂度:程序大概要执行的次数,而非执行的时间 -空间复杂度:程序执行过程中大概所占用的最大内存空间 -难易程度:用易懂,避免过于复杂 -健壮性 3.连续存储【数组】 -什么叫数组:元素类型相同,大小相等 -数组的优缺点 --优点:存取速度很快 --缺点:插入删除元素很慢 4.离散结构【链表】 -定义:n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点同时每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点 -专业术语 --首节点:存放第一个有效数据的节点 --尾节点:存放最后一个有效数据的节点 --头结点:位于首节点之前的一个节点,头结点并不存放有效的数据,加头结点的目的主要是为了方便对链表的操作 --头指针:指向头结点的指针变量 --尾指针:指向尾节点的指针变量 -确定一个链表需要几个参数:只需要一个头指针参数,因为我们通过头指针可以推算出链表的其他所有信息 -分类: --单链表:每一个节点只有一个指针域 --双链表:每一个节点有两个指针域 -

7.数组

荒凉一梦 提交于 2020-03-28 17:25:52
一、数组的概述 1.定义   多个相同数据类型的数据按照一定的顺序排列的集合,使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 2.特点   ①数组是有序排列的;   ②数组本身是引用数据类型,数组中的元素既可以是基本数据类型,也可以是引用数据类型;   ③创建数组会在内存中开辟一整块连续的空间,而数组通过数组名引用的是这块连续空间的首地址;   ④数组一旦初始化完成,其长度就确定了;数组的长度一旦确定,就不能修改;   ⑤通过索引来访问数组中的元素,速度很快 3.分类 按照维数:一维数组、二维数组、多维数组 按照数组中元素的类型:基本数据类型元素的数组、引用数据类型元素的数组 二、一维数组 1.一维数组的声明和初始化 public class test { public static void main(String[] args) { //数组的声明 int[] arr1; String arr2[]; //数组的静态初始化 arr1 = new int[]{1, 2, 3}; //数组的动态初始化 arr2 = new String[4]; //声明+初始化 int[] arr3 = new int[3]; //类型推断 String[] arr4 = {"str1", "str2", "str3"}; } } 2.访问一维数组中的元素 public class

Scala数组| 集合

≡放荡痞女 提交于 2020-03-28 15:31:47
arrays :+ 5尾部 头部5 +: arrays TODO 声明不可变数组,不能删; 默认情况下,scala中集合的声明全都是不可变的 val arrays: Array[Int] = Array(1, 2, 3, 4) //增加 不可变使用伴生对象添加数 val newArrays1: Array[Int] = arrays :+5 //1,2,3,4,5 // 增加数据到集合的尾部,产生新的集合 val newArrays2: Array[Int] = 6+:arrays //6,1,2,3,4 // 增加数据到集合的头部,产生新的集合 //println(newArrays.length) //println(arrays == newArrays1) //false ; ==是否是同一块内存 //println(arrays.length) // 修改数据:数组(索引) = 修改的值; 修改,不变的是内存地址,里边内容可以变 arrays(1)=1 println(arrays.mkString(",")) //1,1,3,4 // 获取数组中的数据 //println(arrays(3)) //循环遍历 for (elem <- arrays) { println(elem) } //println(arrays.mkString(",")) // 生成字符串 //

反射机制

跟風遠走 提交于 2020-03-28 07:30:48
在Swift中并不提倡使用Runtime,而是像其他语言一样使用反射(Reflect)。当然,目前Swift中的反射还没有其他语言中的反射功能强大,不仅远不及OC的Runtime,离Java的反射也有一定的距离。 Swift的反射机制是基于一个叫 Mirror 的 struct 来实现的 //反射事例 //反射机制,取出类的名字,转换成类,还要强转成类的类型 //1.从Bundle取出项目的名字(命名空间 = “项目的名字”+“.”+"类名") //2.修改命名空间,TARGETS -> Build Setting -> 输入product name ->修改即可 print("\(Bundle.main.infoDictionary)") let clsN = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? "" //3.let class NSClassFromString(className) as? class.Type //4. let cls = class?.init() let clsName = clsN + ".ViewController" let cls = NSClassFromString(clsName) as? ViewController.Type let vc = cls?

11-5 笔记

女生的网名这么多〃 提交于 2020-03-28 06:22:40
函数:   函数在调用的时候,会形成一个私有作用域,内部的变量不会被外面访问,这种保护机制叫闭包。这就意味着函数调用完毕,这个函数形成的栈内存会被销毁。   函数归属谁跟它在哪调用没有关系,跟在哪定义有关。   Fn() 调用完毕后得到的是一个匿名函数,但是这个函数在 fn 这个作用域下定义的,所以这个匿名函数内部的变量在 fn 作用域下查找。这种写法可以使函数内部的变量不被销毁。 基类 Object 的子类有   Function Array Number Boolean String Date Math RegExp   函数 数组 数字 布尔 字符串 日期 算数 正则 都是 类。本质都是函数。   String 类   定义字符串的方法:Var st=new String(“hello world”)   简写:Var st=”hello world” 1. 字符串的加号运算 + 仅仅就是拼接 这种方法 叫 字符串拼接。 2. 字符串 prototype 上的方法    (1) charAt() 返回在指定位置的字符 var s=st.charAt(2)   (2) Concat() 链接两个或多个字符串,并返回新的 var s=st.concat(sd,"hello wolrd");   (3) indexOf() 返回某个字符串在字符串中首次出现的位置,没有返回 -1  

js笔记10

随声附和 提交于 2020-03-28 06:12:43
1.闭包    封装:减少代码的冗余,提高代码的重复利用率   继承:本来需要开辟多个空间,只需要开辟一个空间,减少内存的消耗,提高性能   函数归属:函数归属谁,跟他在哪调用没有关系,而跟他在哪定义有关   闭包的定义:函数在调用的时候,会形成一个私有作用域,内部的变量不能被外部访问,这种保护机制叫闭包(这就意味着函数调用完毕,这个函数形成的栈内存就会被销毁)   栈内存被销毁的案例:    function fn(){     var a=12;     a++;      console.log(a)   }   fn() //13   fn() //13   fn() //13 (因内部存在一个变量,所以在函数内部栈内存就会被销毁)       但有时候,我们不希望他被销毁 ,所以需要return   案例:    function fn(){     var a=12     return function(){       a++;       console.log(a)     }   }   var ss=fn()   ss()  //13   ss()  //14   ss()  //15    解析:       fn()调用完毕后得到的是一个匿名函数,但这个匿名函数在fn()这个作用域下定义的,所以匿名函数内部的变量在fn()作用域下查找