数组

集合系列 Queue(十一):ArrayDeque

让人想犯罪 __ 提交于 2020-03-18 17:40:37
目录 1 概述 2 源码分析 1 概述 从名字我们可以看出,其实一个双向队列实现,而且底层采用数组实现。 public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable 从定义可以看出,其实现了 Deque 接口。 2 源码分析 为了深入理解 ArrayDeque 的原理,我们将从类成员变量、构造方法、核心方法两个方面逐一介绍。 2.1 类成员变量 // 数据数组 transient Object[] elements; // 头结点 transient int head; // 尾节点 transient int tail; 从类成员变量我们就可以知道,其底层确实使用数组存储。 2.2 构造方法 ArrayDeque 一共有 3 个构造方法: public ArrayDeque() { elements = new Object[16]; } public ArrayDeque(int numElements) { allocateElements(numElements); } public ArrayDeque(Collection<? extends E> c) { allocateElements(c.size()); addAll

1120 最值交换

我与影子孤独终老i 提交于 2020-03-18 15:14:15
题目来源: https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1120 Description 有一个长度为n的整数序列。请写一个程序,先把序列中的最小值与第一个数交换,再把最大值与最后一个数交换。输出转换好的序列。 分别编写两个函数MinIndex()和MaxIndex()来计算最小值下标和最大值下标。 int MinIndex(int a[], int n); //函数返回数组a中最小元素的下标 int MaxIndex(int a[], int n); //函数返回数组a中最大元素的下标 数组元素的输出调用函数PrintArr()。 Input 输入包括两行。 第一行为正整数n(1≤n≤10)。 第二行为n个正整数组成的序列,保证没有重复元素。 Output 输出转换好的序列。数据之间用空格隔开。 Sample Input 5 5 4 1 2 3 Sample Output 1 4 3 2 5 题意描述: 输入数组元素的个数n及n个元素 交换最大值和尾元素的位置,交换最小值和首元素的位置后输出新数组 解题思路: 调用MinIndex()函数返回最小值的下标,再调用MaxIndex()函数返回最大值的下标,交换即可 程序代码: 1 #include<stdio.h> 2 int MaxIndex(int a[],int n); 3

2019 第六周作业

不想你离开。 提交于 2020-03-18 14:41:17
2019春季第六周作业 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 ( https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888 ) 我在这个课程的目标是 理解变量、内存单元和地址之间的关系,掌握指针变量的基本运算 这个作业在哪个具体方面帮助我实现目标 这个作业让我大概了解了指针的定义及用法 参考文献 ( https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html ) 一、基础题 1、求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double *a, double *b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b

perl中的引用

两盒软妹~` 提交于 2020-03-18 11:28:52
为什么使用引用? 在perl4中,hash表中的value字段只能是scalar,而不能是list,这对于有些情况是很不方便的,比如有下面的数据: Chicago, USA Frankfurt, Germany Berlin, Germany Washington, USA Helsinki, Finland New York, USA 我们想要按国家将城市分类,每个国家后面对应城市列表,如果用perl4来做,必须将城市列表组合成字符串才行,如果用perl5就可以用引用来做,有了引用,就可以构造复杂的hash结构,就可以用列表作为hash的值了。 如何定义引用 方法一 使用斜线\ 定义变量的时候,在变量名前面加个\,就得到了这个变量的一个引用,比如 # 数组的引用my@array= (1,2,3) ;my$aref=\@array ;#哈希的引用my%hash= ("name"=>"zdd","age"=>30,"gender"=>"male") ;my$href=\%hash ;#标量的引用my$scalar=1 ;my$sref=\$scalar ; 方法二 匿名引用 方法一不是很常用,最常用的还是匿名引用,方法如下 匿名数组引用-用[]定义 $aref= [ 1,"foo",undef,13 ]; 匿名数组的元素仍然可以是匿名数组,所以我们可以用这种方法构造数组的数组

数据结构与算法(2)数组

半城伤御伤魂 提交于 2020-03-18 06:59:31
数组 一、什么是数组? 数组是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据。 线性表 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,非线性表中,数据之间并不是简单的前后关系。 连续的内存空间和相同类型的数据 数组正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。 寻址公式 a[i]_address = base_address + i * data_type_size base_address为内存块的首地址 i为数组中元素所在 data_type_size表示数组中每个元素的大小 低效的“插入”和“删除” 插入操作 如果在数组末尾插入元素就不需要移动数据,这时的时间复制度为O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次向后移动一位,所以最坏的时间复制度为O(n)。因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复制度为(1+2+...n)/n=O(n)。 如果数组是有序的,如果要将某个数据插入到第k个位置

js数组去重的几种方法

孤人 提交于 2020-03-18 04:07:22
1.遍历数组法 最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下: // 最简单数组去重法 function unique1(array){ var n = [ ]; //一个新的临时数组 //遍历当前数组 for(var i = 0; i < array.length; i++){ //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(array[i]) == 一1) n.push(array[i]); } return n; } // 判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持 if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = 一1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len =

JDK8中的Bug

淺唱寂寞╮ 提交于 2020-03-18 00:46:10
在CopyOnWriteArrayList 和ArrayList 的构造函数中: public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } public CopyOnWriteArrayList(Collection<? extends E> c) { Object[] elements = c.toArray(); // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elements.getClass() != Object[].class) elements = Arrays.copyOf(elements, elements.length, Object[].class); setArray

HashMap底层源码剖析

十年热恋 提交于 2020-03-17 19:17:23
HashMap底层源码剖析 数组+单向链表+红黑树 数组:    数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:    当法神hash碰撞时,首先会找到数组对应位置,然后1.8采用尾插入法(1.7采用头插入法),形成一个单项链表结构 红黑树:   当数组中每项的链表长度大于8时,会转换为红黑树 什么是hash碰撞?解决方案 hash碰撞:    不同的key可能会产生相同的hash值; 方案:    链表发,再哈希法; hashMap中采用链表发,在ConcurrentHashMap中采用哈希法; 为什么采用红黑树,比如二叉查找树,并且为什么临界值为8    二叉查找树在特殊情况下也会变为线性结构,和原来链表有共同的问题,节点太深,查找性能慢 使用红黑树主要用于提升查询速度,红黑树是平衡二叉树的一种,插入新的数据都会通过左旋,右旋,变色等操作来保持平衡,解决节点的深度问题   当数据较少时,采用链表要比红黑树效率高,因为平衡二叉树保持平衡需要耗费资源,那么前期数据较少时采用链表,当数据到达一定的界限后,再采用 红黑树,可以加快数据查询速度,官方测试8为性能最优 put()底层源码剖析 public V put(K key, V value) { return putVal(hash(key), key, value, false, true);     } /**

HashMap底层源码与实现逻辑

依然范特西╮ 提交于 2020-03-17 19:02:20
ConcurrentHashMap性能高于HashTable,都能够完成线程安全操作, Hashtable中线程安全使用synchronized同步方法进行加锁操作,如果当前一个线程正在访问该集合,其他线程是无法进行访问的,需要进行等待 反之ConcurrentHashMap当中采用分段锁机制 JDK1.7和JDK1.8底层实现的区别 JDK1.8版本之前,ConcurrentHashMap使用分段锁技术,将数据分成一段一段的进行村粗,每一个数据段配置一把锁Segment(继承ReentrantLock) 底层采用:Segment+HashEntry 当数据添加时,根据key值找到Segment对应的数据段,然后匹配数据块,采用链表方式进行存储 1.1JDK1.7底层实现 在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成: Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样 1.2JDK1.8底层实现 JDK1.8的实现已经摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现

ClickHouse 概念整理

我怕爱的太早我们不能终老 提交于 2020-03-17 18:59:36
什么是ClickHouse? 毛子开源的一个列式存储数据库(DBMS), 主要用于OLAP, 能使用SQL查询实时生成分析数据报告。 可以类比HBase 数据类型 与其他框架比较 MySQL Hive ClickHouse byte TINYINT Int8 short SMALLINT Int16 int INT Int32 long BIGINT Int64 varchar STRING String timestamp TIMESTAMP DateTime float FLOAT Float32 double DOUBLE Float64 boolean BOOLEAN 无 整形 固定长度的整形, 包括有符号整型或无符号整型。 整型范围 (-2 n-1 , 2 n-1 -1) 无符号整型范围 (0 ~ 2 n -1) 浮点型(不建议用, 有精度损失问题) Float32 Float64 布尔型 没有单独的类型来存储布尔值。可以使用 UInt8 类型, 取值限制为 0 或 1。 字符串 String 字符串可以是任意长度的。它可以包含任意的字节集, 包含空字节。 FixedString(N) 固定长度 N 的字符串, N必须是严格的正自然数。 当服务端读取长度小于 N 的字符串时, 通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大鱼 N 的字符串时,