数组公式

java源码解析

会有一股神秘感。 提交于 2019-12-02 06:39:43
String深入解析 String具有不变性的原因: String被final修饰,它不可能被继承,也就是任何对String的操作方法,都不会被继承覆写 String中保存数据的是一个char数组的value,它被final修饰,它的内存地址一旦赋值无法修改 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; } String相等判断源码 public boolean equals(Object anObject) { // 判断内存地址是否相同 if (this == anObject) { return true; } // 待比较的对象是否是 String,如果不是 String,直接返回不相等 if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; // 两个字符串的长度是否相等,不等则直接返回不相等 if (n == anotherString

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

旧巷老猫 提交于 2019-12-02 06:24:53
数组 一、什么是数组? 数组是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据。 线性表 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,非线性表中,数据之间并不是简单的前后关系。 连续的内存空间和相同类型的数据 数组正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。 寻址公式 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个位置

基于Java并发容器ConcurrentHashMap#put方法解析

为君一笑 提交于 2019-12-01 12:58:05
jdk1.7.0_79 HashMap可以说是每个Java程序员用的最多的数据结构之一了,无处不见它的身影。关于HashMap,通常也能说出它不是线程安全的。这篇文章要提到的是在多线程并发环境下的HashMap——ConcurrentHashMap,显然它必然是线程安全的,同样我们不可避免的要讨论散列表,以及它是如何实现线程安全的,它的效率又是怎样的,因为对于映射容器还有一个Hashtable也是线程安全的但它似乎只出现在笔试、面试题里,在现实编码中它已经基本被遗弃。 关于 HashMap的线程不安全,在多线程并发环境下它所带来的影响绝不仅仅是出现脏数据等数据不一致的情况, 严重的是它有可能带来程序死循环 ,这可能有点不可思议,但确实在不久前的项目里同事有遇到了 CPU100%满负荷运行,分析结果是在多线程环境下HashMap导致程序死循环。对于Hashtable,查看其源码可知,Hashtable保证线程安全的方式就是利用synchronized关键字,这样会导致效率低下,但对于ConcurrentHashMap则采用了不同的线程安全保证方式—— 分段锁 。它不像 Hashtable那样将整个table锁住而是将数组元素分段加锁,如果线程1访问的元素在分段segment1,而线程2访问的元素在分段segment2,则它们互不影响可以同时进行操作。如果合理的进行分段就是其关键问题。

一篇说尽Excel常见函数用法

狂风中的少年 提交于 2019-12-01 12:12:14
一篇说尽Excel常见函数用法 Word,PPT,Excel这三个Office软件是职场办公里最常用的三个软件,但是我发现简书上写PPT的教程多,Excel的少,即使有,也是零零散散。因为Excel的系统庞大其实你如果耐心钻研下去的话,发现excel难度不亚于任何专业软件的难度。总体来说,excel的常用功能包括以下五项: 本篇只讲函数。因为函数用好了,也可以节省很多的时间。我看到有很多职场新人只会用自动求和和求平均数,所以普及一下常用函数还是很有必要(其实也算不上普及,共同学习而已)。 很多人都会有这样一个概念,遇到问题再百度呗,我觉得那样是被动的,不系统的,如果提前了解一下到时候再百度也会有大概一个方向。 写完才发现,写了很长,高能预警,最后有彩蛋。 excel 2016中函数共有400多个:如图 较常用的是文本函数,逻辑函数,日期与时间函数,查找与引用函数,数学函数等,很多人一看到这些就头大,感觉太多了,没有头绪?那么哪些函数是最常用的呢? 下面我打破这个顺序,按照类型讲一下。 为节省字数,我尽量多用图,并且把同一类型的对比着来讲,不会很散: 相对引用于绝对引用: 相对引用:单元格或单元格区域的相对引用是指相对于包含公式的单元格的相对位置。例如,单元格 B2 包含公式 =A1 ;Excel 将在距单元格 B2 上面一个单元格和左面一个单元格处的单元格中查找数值。 绝对引用:1

重新认识Java 8的HashMap

瘦欲@ 提交于 2019-12-01 11:46:32
【转自】 美团技术博客 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 (2) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似

致初学者(三): HDU 2033~ 2043题解

北城以北 提交于 2019-12-01 11:05:56
致初学者(三): HDU 2033~ 2043题解 下面继续给出2904628156的AC程序,供大家参考。2033~2043这10道题就被归结为“ACM程序设计期末考试(2006/06/07) ”和“2005实验班短学期考试 ”。 HDU 2033:人见人爱A+B 简单分支结构。 View Code HDU 2034:人见人爱A-B 设用数组a,b,c分别表示集合A,B,C,其中 C=A-B。 用循环 for (i=0;i<n;i++) 处理集合A中的每个元素a[i],对于元素a[i] 用循环 for (j=0;j<m;j++) 在集合B中查找a[i]是否在集合B中存在,如果a[i]不在集合B中出现,则将a[i]保存到数组c中,作为集合C的一个元素。 得到数组c后,输出前采用冒泡排序按从小到大的顺序对数组c进行排序。 View Code HDU 2035:人见人爱A^B 采用快速幂运算完成A^B的计算。 View Code HDU 2036:改革春风吹满地 利用向量积(叉积)计算多边形的面积公式为: 对于此公式推导过程有兴趣的同学可以参阅网上的一篇博文“ 利用向量积(叉积)计算三角形的面积和多边形的面积 ”。 View Code HDU 2037:今年暑假不AC 定义一个结构体 struct showtime { int begin; int end; };

致初学者(三): HDU 2033~ 2043题解

孤人 提交于 2019-12-01 11:03:50
致初学者(三): HDU 2033~ 2043题解 下面继续给出2904628156的AC程序,供大家参考。2033~2043这10道题就被归结为“ACM程序设计期末考试(2006/06/07) ”和“2005实验班短学期考试 ”。 HDU 2033:人见人爱A+B 简单分支结构。 View Code HDU 2034:人见人爱A-B 设用数组a,b,c分别表示集合A,B,C,其中 C=A-B。 用循环 for (i=0;i<n;i++) 处理集合A中的每个元素a[i],对于元素a[i] 用循环 for (j=0;j<m;j++) 在集合B中查找a[i]是否在集合B中存在,如果a[i]不在集合B中出现,则将a[i]保存到数组c中,作为集合C的一个元素。 得到数组c后,输出前采用冒泡排序按从小到大的顺序对数组c进行排序。 View Code HDU 2035:人见人爱A^B 采用快速幂运算完成A^B的计算。 View Code HDU 2036:改革春风吹满地 利用向量积(叉积)计算多边形的面积公式为: 对于此公式推导过程有兴趣的同学可以参阅网上的一篇博文“ 利用向量积(叉积)计算三角形的面积和多边形的面积 ”。 View Code HDU 2037:今年暑假不AC 定义一个结构体 struct showtime { int begin; int end; };

数组分配与访问

元气小坏坏 提交于 2019-12-01 06:59:53
数组:将标量数据聚集成更大数据类型 C语言实现数组简单,容易翻译成机器代码 在机器代码中,这些指向数组元素的指针会被翻译成地址计算 优化编译器非常善于 简化数组索引所使用的地址计算 ,这使得我们难以理解C语言代码与机器代码的对应关系 一. 基本原则 一维数组的声明:T A[N](T为数据类型,N为常数) 两个效果:在内存中分配L*N字节的连续区域;引入标识符A,用A来作为指向数组开头的指针,值为x A 数组元素i会存放在x A +i*L的地方 内存引用指令 可以用来 简化数组访问 movl (%rdx, %rcx, 4), %eax 执行地址计算xA+4i,并将结果存放在寄存器%eax中 伸缩因子1, 2, 4, 8覆盖了所有数据类型的大小 知识点回顾 : 内存引用是操作数的一种 操作数 一共有 3 种: 立即数 (书写方式:‘$’后面跟一个用标准C表示法表示的整数,例如$-577,$0x1F)、 寄存器 (书写方式为寄存器的名称ra,实际上操作的是寄存器里的值R[ra],将寄存器集合看成一个数组R,用寄存器标识符作为索引)、 内存引用 (根据 计算出来的地址 Addr访问某个内存位置Mb[Addr],表示对存储在内存中地址Addr开始的b个字节值的引用) 计算地址的方式称为 寻址模式 ,具体形式为:Imm(rb, ri, s) Imm表示一个立即数,rb称为 基址寄存器

寻找两个有序数组的中位数

ⅰ亾dé卋堺 提交于 2019-12-01 05:40:50
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。(LeetCode题目) 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 方法一:子集划分 为了解决这个问题,我们需要理解 “中位数的作用是什么”。在统计中,中位数被用来:将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。 如果理解了中位数的划分作用,我们就很接近答案了。 首先,让我们在任一位置 i 将 A划分成两个部分: left_A | right_A A[0], A[1], ..., A[i-1] | A[i], A[i+1], ..., A[m-1] 由于 A中有 m个元素, 所以我们有 m+1种划分的方法(i=0∼m)。 我们知道: len(left_A)=i,len(right_A)=m−i 注意:当 i=0 时,left_A为空集, 而当 i=m时, right_A为空集。 采用同样的方式,我们在任一位置 j将 B划分成两个部分: left_B | right_B B[0],

【布隆算法】布隆算法最详解

吃可爱长大的小学妹 提交于 2019-11-30 19:13:54
布隆算法最详解 本文源地址: http://www.fullstackyang.com/...,转发请注明该地址或segmentfault地址,谢谢! 1. 背景知识 在网上已经有很多关于布隆过滤器的介绍了,这里就不再赘述,下面简单地提炼几个要点: 布隆过滤器是用来判断一个元素是否出现在给定集合中的重要工具,具有快速,比哈希表更节省空间等优点,而缺点在于有一定的误识别率(false-positive,假阳性),亦即,它可能会把不是集合内的元素判定为存在于集合内,不过这样的概率相当小,在大部分的生产环境中是可以接受的; 其原理比较简单,如下图所示,S集合中有n个元素,利用k个哈希函数,将S中的每个元素映射到一个长度为m的位(bit)数组B中不同的位置上,这些位置上的二进制数均置为1,如果待检测的元素经过这k个哈希函数的映射后,发现其k个位置上的二进制数不全是1,那么这个元素一定不在集合S中,反之,该元素可能是S中的某一个元素(参考1); 综上描述,那么到底需要多少个哈希函数,以及创建长度为多少的bit数组比较合适,为了估算出k和m的值,在构造一个布隆过滤器时,需要传入两个参数,即可以接受的误判率fpp和元素总个数n(不一定完全精确)。至于参数估计的方法,有兴趣的同学可以参考维基英文页面,下面直接给出公式: 哈希函数的要求尽量满足平均分布,这样既降低误判发生的概率