数组公式

ArrayList与LinkedList的区别

荒凉一梦 提交于 2019-12-26 03:50:56
说白了,就是数据结构中的顺序存储和链式存储的区别 一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态 数组 的数据结构,LinkedList基于 链表 的数据结构。 2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 ArrayList其实是包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayList中添加对象时,数组的大小也相应的改变。这样就带来以下缺点: 快速随即访问 你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的数组元素。 向其中添加对象速度慢 当你创建数组是并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。 操作其中对象的速度慢 当你要想数组中任意两个元素中间添加或者删除对象时,数组需要移动所有后面的对象。 LinkedList LinkedList是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。这样就带来以下有缺点

第五单元 数组 总结

时光总嘲笑我的痴心妄想 提交于 2019-12-24 19:07:00
第一课 一维数组的定义 cin >> h0 >> h1 >> h2 >>...>> h49;//程序中是不能用省略号来表示的。 显然这样的程序代码冗长繁琐,编程效率差,因此引入数组的概念。 数组 数组就是一组相同类型的变量。他们往往都是为了表示同一批对象的统一属性。 例如,for (i=0;i<=49;i++) cin>>h[i]; 数组本身是变量,数组经常应用在大批量同一类型的数据处理任务中。以减少代码的长度。 1.一维数组的定义 格式如下 类型标识符(原数据) 数组名(变量类型) [常量表达式]; 其中类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以一起定义。 数组名必须是合法的标识符。 常量表达式的值即为数组元素的个数。 int d[50],g[100]; int a[5*10]; #define N 50; int b[N]; 以上几个定义也是允许的。 2.一维数组的元素引用 数组定义好后,就可以引用数组中的任意元素,引用格式为 数组名[下标] 例如,h[5] 数组的下标从0开始,h为数组名,[5]表示的是第六个元素。 下标只能为整型常量或整型表达式值必须在数组定义的下标范围内,否则会出现下标越界错误。 需要特别注意,不能一次引用整个数组,只能逐个引用数组中的单个元素。 3.一维数组的存储结构 数组在计算机内存单元中是连续储存的

排序算法 (Java)

余生长醉 提交于 2019-12-24 18:32:39
视频参考:B站:马士兵,青岛大学–王卓。 时间复杂度 Big O 算法花费时间随着问题规模的扩大的变化 不考虑必须要做的操作:循环、赋初值、程序初始化…; 不考虑常数项; 不考虑低次项; 一般时间复杂度都是“最差”的情况 E.g.: 访问数组某个位置的值: O(1) 访问链表某个位置的值: O(n) 求数组平均数:O(n) 选择排序 SelectionSort 最简单 最没用: O(n^2), 不稳定 找到最小的数的位置(索引) 把这个位置上的数和【0】上的数交换 把除第一个位置之后的剩余部分的数组重复过程,确定位置【1】的数 循环3的操作,直到最后一个数 时间复杂度:计算执行次数最多语句的时间随着规模扩大的规律,然后忽略常数项、低次项 笔记:外循环i控制每轮要排的最小值的索引;内循环遍历最小值索引后的每一位索引的值,与当前最小值索引上的值作比较,把最小的值换到最小值索引上。 /** * 选择排序 * @param arr */ public static void selectionSort(int[] arr) { //由于要保证i后面还有数才需要排序,所以i最大可以取到[arr.length-2]就行 for (int i = 0; i < arr.length-1 ; i++) { //执行n次 int minPos = i; //每次循环的要求的最小值的位置都加1 /

jdk1.8源码分析之HashMap

冷暖自知 提交于 2019-12-24 11:53:00
原文链接:https://segmentfault.com/a/1190000012926722?utm_source=tag-newest 1.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap 。HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。另外,需要注意的是,HashMap 是非线程安全类,在多线程环境下可能会存在问题。 在本篇文章中,我将会对 HashMap 中常用方法、重要属性及相关方法进行分析。需要说明的是,HashMap 源码中可分析的点很多,本文很难一一覆盖,请见谅。 2.原理 上一节说到 HashMap 底层是基于散列算法实现,散列算法分为散列再探测和拉链式。HashMap 则使用了拉链式的散列算法,并在 JDK 1.8 中引入了红黑树优化过长的链表。数据结构示意图如下: 对于拉链式的散列算法,其数据结构是由数组和链表(或树形结构)组成。在进行增删查等操作时,首先要定位到元素的所在桶的位置,之后再从链表中定位该元素。比如我们要查询上图结构中是否包含元素 35 ,步骤如下: 定位元素 35 所处桶的位置, index = 35 %

Java,该学什么?

被刻印的时光 ゝ 提交于 2019-12-24 04:29:44
本人大学学的是生物技术专业,毕业后入坑Java。 最近有人问我是如何转行的,需要学一些什么。我在网上看到一篇帖子,觉得写得很全。如果是我来写,可能还写不了这么全的。在此分享给网友。 2019秋招几个月累积的知识点,东西太多,懒得重整理做索引,尽量用(*)和 加粗 标注出高频知识点, 都是面试问过的或笔试考过的 Java基础知识(*) https://blog.csdn.net/qq_16633405/article/details/79211002 Spring Boot 启动 流程(*) https://juejin.im/post/5b679fbc5188251aad213110#heading-0 Spring 一些面试题(*) https://www.ctolib.com/topics-35589.html 匿名内部类编译class(*) https://blog.csdn.net/lazyer_dog/article/details/50669473 为什么集合类没有实现Cloneable和Serializable接口? https://www.nowcoder.com/questionTerminal/2a4902f67d5b49b6b4c05f9d7e422caf 自动装箱原理 https://www.jianshu.com/p/0ce2279c5691

如何写出高效的链表代码

谁说胖子不能爱 提交于 2019-12-23 00:26:05
本篇文章将介绍下面这些内容,阅读预计15分钟。 文章目录 链表和数组区别 面试题常考的链表算法 LeetCode练习题索引 总结: 链表和数组区别  我们在问两个事物的区别时,我们实质是在问这两者分别是什么?而非真的关注差别本身。 数组: 数组是一种线性表数据结构。它用 连续的内存空间 ,存储 相同类型的数据 。  数组因为申请内的存是连续的内存空间,所以在知道First Index 的内存地址后,可以立即通过位置的 偏移 计算出其他任何位置(下标)的内存地址。也就是我们常说的随机访问的特性。 例如存储整数的一个Array,每个整数占4字节,在内存中的情况如下: 在知道arr[0]的内存地址是 0x100后,可以通过公式求取任意位置的内存地址: adrr[n] = 100+4*n 因为这个特性,可以利用CPU的高速缓存,在读取数组时,预读取一组数据,加快访问效率。 链表: 链表也是一种线性表数据结构,它通过 指针 把各个 零散 的节点串联起来。  将数组和链表放在一起看,可以发现,链表的内存地址不一定是连续的,系统不会预先分配给链表指定大小的内存空间。当向链表中存放数据,系统会寻找未使用的内存块,存放数据,然后把前一个节点的指针指向该内存。 所以当数组申请一个1G大小的空间时,系统可能因为没有足够的内存空间而创建失败。而链表不存在这样的问题,它使用的是系统中零散的内存。

Array和特殊数组的压缩

蓝咒 提交于 2019-12-22 13:29:13
1. Array数组简介 当我们提到数组时,很多时候都说的是一维数组,一维数组是线性的,但数组本身并不是线性的,它包括二维,多维数组。 数组在内存中的分配是连续的,也就意味着你在创建它时就需要告诉内存它的容量(length)。这里我们用length表示,以和Java中的数组属性一致。length在java的数组中是固有属性,在一般情况下也是所以其他的数组实现是固有属性。 1.1 Array的数学表达 如果你擅长离散,你将会很乐意看见这样的表达方式 数据对象: j 1 = 0 , . . . , b i − 1 , i = 1 , 2 , . . . , n , j_1 = 0,...,b_i-1,\quad i = 1,2,...,n, j 1 ​ = 0 , . . . , b i ​ − 1 , i = 1 , 2 , . . . , n , D = { a j 1 j 2 . . . j n ∣ n ( > 0 ) 称 为 数 组 的 维 度 , b 1 是 数 组 第 i 维 的 长 度 , j i 是 数 组 第 i 维 的 下 标 , a j 1 j 2 . . . j n ∈ E l e m S e t } D = \lbrace a_{{j_1}{j_2}...{j_n}}|n(>0)称为数组的维度,b_1是数组第i维的长度,j_i是数组第i维的下标,a_{{j_1

来吧!给你不一样的数组深入讲解

我的未来我决定 提交于 2019-12-22 03:46:17
不知道为啥,数组让我写的很痛苦!写到深夜两点啊,不容易,各位看官,记得点赞😂,不然没动力了 数组小谈😁 庆哥: 嗨,小白,知道啥是数组吗?😎 小白: 你看你这话说的,数组那还不简单,学计算机的没有不知道数组的吧,我们刚开始接触C语言的时候就有数组啊,现在在学习java,也有数组啊,一般不就这样嘛😁 int[] array = new int[10] 这就创建了一个长度为10的数组,是不是?😀 庆哥: 嗯嗯,你还知道数组的啥啊。比如特性啥的? 小白: 这个嘛,数组啊,最经典的不就是可以根据数组下标来读取数据吗?比如上面定义的那个长度为10的数组,可以使用array[1]来获得数组第二个位置的数据。 庆哥: 为啥不是第一个的数据,那不是1吗? 小白: 这个嘛,那是因为数组下标是从0开始的,所以实际上1就是2的位置,就像这样: 庆哥: 那数组下标为啥从0开始啊😎 小白: 嗯。。。这个?😂不知道 庆哥: 在Java中数组其实可以看做是一个对象嘛?😉 小白: 纳尼?没有考虑过这个问题啊🤣 庆哥: 知道Array和Arrays嘛🤗 小白: 不是太清楚😅 庆哥: 哈哈,来吧,今天就让你彻底搞懂数组这家伙😎 小白: 小板凳已备好😄 啥是数组啊😂 天马星空看数组😎 庆哥: 既然我们要学习数组,那首要的任务就是先要弄懂,啥是数组?你现在清空大脑,不要想着什么数组是数据结构,什么连续内存,什么随机访问

第一篇CSDN博客

℡╲_俬逩灬. 提交于 2019-12-18 18:56:58
(小白进阶中) 课设题目:创建多维数组 ##要求: 1创建整数型多维数组,各维下标是给出任意整数开始的连续整数 2 给出下标能找出该下标对应的数 3能对给出的下标对应的元素赋值 4能对给出的子数组赋值 ##代码示例 #include<stdarg.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MaxDim 5 typedef struct{ int dim, //数组维数 *upper, //数组上界的指针 *lower, //数组下界的指针 *constants, //数组映像函数常量表 *data, //数组元素内容 num, //数组总个数 pis; //元素在数组中位置 如五维数组各维上界为5,下界为0 }NArray; NArray A; void Open() //用户选择界面 { printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"); printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ \n"); printf(" 多维数组生成器\n"); printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ \n"); printf(" 功能选项:\n"); printf(" 1.定义一个整型多维数组.\n"); printf(" 2

同步容器与并发容器

戏子无情 提交于 2019-12-17 03:36:32
同步容器 性能差,线程不安全 Vector (线程安全)--> ArrayList(线程不安全) Vector public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; } 直接在方法上加同步,保证线程安全,不适用并发执行,性能损耗大 arrayList 1 public boolean add(E e) { 2 ensureCapacityInternal(size + 1); // Increments modCount!! 3 elementData[size++] = e; 4 return true; 5 } ArrayList<String> s = new ArrayList<>(); Collections.synchronizedList(s); 保证线程安全 static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E>add() 1 public void add(int index, E element) { 2 synchronized