数组公式

数组动态扩容时间复杂度分析

痞子三分冷 提交于 2019-11-30 18:02:34
对于数组动态扩容,当在数组尾部插入元素时只需要O(1)的时间复杂度,但是当插入元素刚好达到扩容的边界时,这时需要申请一块新的内存尺寸为原来的两倍,并将原数组的元素复制到新数组中,看起来数组的追加元素的效率并不高,但是因为是两倍扩容,假设数组的初始容量为2,对于N次的追加操作来说,需要扩容的次数为logN次 所以扩容的总共复制操作为 logN ∑ 2^i i = 2 这个求和公式为等比数列,既 a1=2,q=2,Sn=2(1-2^logN)/(1-2)=2(2^logN-1)=2^(logN+1)-2 忽略乘2和减2, 渐进为2^logN,所以渐进复杂度为O(N),分摊到N次的插入操作中,时间复杂度为O(1)。 来源: https://my.oschina.net/u/3737002/blog/3113445

排序(下):如何用快排思想在O(n)内查找第K大元素?

我与影子孤独终老i 提交于 2019-11-30 17:56:22
冒泡排序、插入排序、选择排序它们的时间复杂度都是O(n 2 ),适合小规模数据的排序。 大规模的数据排序可以用时间复杂度为O(nlogn)的排序算法, 归并排序 和 快速排序 。 归并排序的原理 将待排序的数组,从数组中间分成左右两部分,然后对左右两部分分别排序,再将排好序的凉部分数组合并在一起,这样就完成待排序数组的排序了。其利用的是分治思想,即将一个大问题分解成小的子问题来解决,分治算法一般都是使用递归来实现的。 static void Main(string[] args) { int[] iarray = new int[] { 11, 8, 3, 9, 7, 1, 2, 5 }; mergeSortInternally(iarray, 0, iarray.Length - 1); Console.WriteLine(string.Join(",", iarray)); Console.ReadKey(); } private static void mergeSortInternally(int[] array, int start, int end) { // 递归终止条件 if (start >= end) return; // 取start到end之间的中间位置mid,防止(start+end)的和超过int类型最大值 //int mid = (start +

算法图解学习笔记之算法

浪子不回头ぞ 提交于 2019-11-30 16:08:03
一、二分查找 二分查找的输入是一个有序的元素列表。如果元素在列表中,返回其位置,否则返回null 二分查找每次都将列表分成两半,分别与查询元素对比。舍弃其中一半。然后再另一半中查找元素。 每次都可以排除一半的元素。所以其效率为O(logn以2为底) 二分查找查询的速度非常快,但是要求也比较严格,需要有序的列表。如果是无序的列表,就不能每次排查一半了。 二、递归 递归应该不算算法的一种,但是还是稍微提一下 递归其实就是循环调用某个函数,直到满足条件才退出。 递归中很重要的是基线条件和递归条件 基线条件是退出递归的条件,如果没有基线条件,那么递归不会停止。陷入无限的循环中。 递归条件是满足这些条件才循环调用函数。 两者缺一不可 三、快速排序(排序算法的一种,简称快排) 快排经常会和递归一起使用 其基线条件为,数组为空或者只包含一个元素。因为为空和只有一个元素就不需要排序了,直接返回。 递归条件为,从数组中取出一个元素,将其他元素分成两部分,一部分大于该元素,一部分小于该元素(等于可以包含再大于或者小于之中,都可以),然后递归调用大于该元素的数组和小于该元素的数组。返回大于元素的数组(递归调用结束后有序)+元素+小于元素的数组(递归调用结束后有序)。 快排的最好情况效率是O(n*logn),最坏情况是O(n*n) 假设传入的是一个有序的数组 我们选择的元素是数组第一个元素。

php常用数组函数

荒凉一梦 提交于 2019-11-30 11:20:57
php常用数组函数 大致需求前文以及简单介绍过,数据表按照时间生成,每天一张,每张表大约80W+数据量,加上需要获取多日的数据,例如获取连续5日登陆的用户。 需求:玩家留存率、时间可选,开始时间以及结束时间 表头包含:新注册用户数量、次日留存、2日留存…30日留存 分析: 留存率公式:第N日该批用户登录数量/当日注册用户数量 log表数据结构比较特殊,所有的log表字段一致,只用type去区分,字段为id、插入时间、用户ID、用户名称、type、参数1…参数20,实际参数代表的意义以及type的意思均为代码中常量定义。 因此如果单纯用mysql语句去操作,涉及跨表、联合、join等操作,实际测试单一一条语句均要超过6s以上,这种情况是完全无法接受的,因为查询时间可选,那么就导致如果筛选多日,随随便便都需要等待1分钟以上。 所以最终选择只用mysql去做最简单的查询操作,包含上尽可能多的的where语句限定并group by特定的key,其余全部使用php去操作数组完成,最后成果为每一条独立的sql语句耗时0.2-0.3s左右(全表无索引),包含php操作后最后输出单日数据约1s左右,因为此后台只是内部使用,已基本满足要求。 1.非常好用的Laravel内置数组辅助函数,array_pluck() array_pluck( array $array , string $value

线性表——顺序表的实现与讲解(C++描述)

眉间皱痕 提交于 2019-11-30 07:54:46
线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这种组织数据(同学)的方式我们可以称作线性表结构 定义 线性表 :具有零个或多个(具有相同性质,属于同一元素的)数据元素的有限序列 若将线性表记为 ( a 0 , a 1 ,a i -1 a i ,a i +1 , ... , a n - 1 , a n ) 注意:i 是任意数字,只为了说明相对位置,下标即其在线性表中的位置) 前继和后继 :由于前后元素之间存在的是 顺序关系 ,所以除了首尾元素外,每个元素均含有 前驱 和 后继 ,简单的理解就是 前一个 元素和后一个元素 空表 :如果线性表中元素的个数 n 为线性表长度,那么 n = 0 的时候,线性表为空 首节点、尾节点 : 上面表示中的 :a 0 称作首节点,a n 称作尾节点 抽象数据类型 数据类型 :一组 性质相同 的值的集合及定义在此集合上的一些操作的 总称 抽象数据类型 :是指一个数学模型及定义在该模型上的一组操作 关于数据类型我们可以举这样一个例子 例如:我们常常用到的 整数型 浮点型 数据 这些都是数据的总称,所有符合其性质特征的都可以用其对应数据类型来定义,例如 520是一个满足整数特征的数据,所以可以赋值给

哈希表(散列表)原理详解

随声附和 提交于 2019-11-30 07:51:18
想要知道什么是哈希表,得先了解哈希函数知道 哈希函数 地址index=H(key) 说白了,hash函数就是根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表 几种常见的哈希函数(散列函数)构造方法   直接定址法 取关键字或关键字的某个线性函数值为散列地址。 即 H(key) = key 或 H(key) = a*key + b,其中a和b为常数。        除留余数法 取关键字被某个不大于散列表长度 m 的数 p 求余,得到的作为散列地址。 即 H(key) = key % p, p < m。        数字分析法 当关键字的位数大于地址的位数,对关键字的各位分布进行分析,选出分布均匀的任意几位作为散列地址。 仅适用于所有关键字都已知的情况下,根据实际应用确定要选取的部分,尽量避免发生冲突。        平方取中法 先计算出关键字值的平方,然后取平方值中间几位作为散列地址。 随机分布的关键字,得到的散列地址也是随机分布的。        折叠法(叠加法) 将关键字分为位数相同的几部分,然后取这几部分的叠加和(舍去进位)作为散列地址。 用于关键字位数较多,并且关键字中每一位上数字分布大致均匀。          随机数法 选择一个随机函数,把关键字的随机函数值作为它的哈希值。 通常当关键字的长度不等时用这种方法。 构造哈希函数的方法很多

Javascript

喜夏-厌秋 提交于 2019-11-30 06:55:09
Javascript Web前端有三层: HTML:从语义的角度,描述页面 结构 CSS:从审美的角度,描述 样式 (美化页面) JavaScript:从交互的角度,描述 行为 (提升用户体验) 其中JavaScript基础又分为三个部分: ECMAScript:JavaScript的语法标准。包括变量、表达式、运算符、函数、if语句、for语句等。 DOM:文档对象模型,操作网页上的元素的API。比如让盒子移动、变色、轮播图等。 BOM:浏览器对象模型,操作浏览器部分功能的API。比如让浏览器自动滚动。 1.Javascript背景介绍 布兰登 • 艾奇(Brendan Eich,1961年~),1995年在网景公司,发明的JavaScript。 一开始JavaScript叫做LiveScript,但是由于当时Java这个语言特别火,所以为了傍大牌,就改名为JavaScript。 同时期还有其他的网页语言,比如VBScript、JScript等等,但是后来都被JavaScript打败了,所以现在的浏览器中,只运行一种脚本语言就是JavaScript 发展历程 2003年之前,JavaScript被认为“牛皮藓”,用来制作页面上的广告,弹窗、漂浮的广告。什么东西让人烦,什么东西就是JavaScript开发的。所以浏览器就推出了屏蔽广告功能。 2004年

Bit-map算法实现

无人久伴 提交于 2019-11-30 06:09:09
Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 1. Bit-map应用 1)可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下。 2)去重数据而达到压缩数据 2. Bit-map算法评价 优点: 1. 运算效率高,不进行比较和移位; 2. 占用内存少,比如最大的数MAX=10000000;只需占用内存为MAX/8=1250000Byte=1.25M。 缺点: 1. 所有的数据不能重复,即不可对重复的数据进行排序。(少量重复数据查找还是可以的,用2-bitmap)。 2. 当数据类似(1,1000,10万)只有3个数据的时候,用bitmap时间复杂度和空间复杂度相当大,只有当数据比较密集时才有优势。 3. Bit-map算法示例 3.1 只需要1个8bit空间的例子 假设要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么就可以采用Bit-map的方法来达到排序的目的。 用8个Bit(1Bytes)来表示0-7内的8个数,并将这些空间的所有Bit位都置为0(如下图): 然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)) 当然了这里的操作涉及到Big

面试官: 既然已经有数组了,为什么还要链表

血红的双手。 提交于 2019-11-30 03:50:53
面试官: 既然已经有数组了,为什么还要链表 本文发布于微信平台: 程序员面试官 超过20w字的「前端面试与进阶指南」可以移步 github 对于不少开发者而言,链表(linked list)这种数据结构既熟悉又陌生,熟悉是因为它确实是非常基础的数据结构,陌生的原因是我们在业务开发中用到它的几率的确不大. 在很多情况下,我们用数组就能很好的完成工作,而且不会产生太多的差异,那么链表存在的意义是什么?链表相比于数组有什么优势或者不足吗? 什么是链表 链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer). 从本质上来讲,链表与数组的确有相似之处,他们的相同点是都是线性数据结构,这与树和图不同,而它们的不同之处在于数组是一块连续的内存,而链表可以不是连续内存,链表的节点与节点之间通过指针来联系. 当然,链表也有不同的形态,主要分为三种:单向链表、双向链表、循环链表. 单向链表 单向链表的节点通常由两个部分构成,一个是节点储存的值 val ,另一个就是节点的指针 next . 链表与数组类似,也可以进行查找、插入、删除、读取等操作,但是由于链表与数组的特性不同,导致不同操作的复杂度也不同. 查找性能 单向链表的查找操作通常是这样的: 从头节点进入,开始比对节点的值,如果不同则通过指针进入下一个节点 重复上面的动作

算法学习笔记

試著忘記壹切 提交于 2019-11-30 03:28:29
一、学习内容 二分查找法非递归 分治算法 动态规划算法 KMP算法 贪心算法 普里姆算法 克鲁斯卡尔算法 迪杰斯特拉算法 弗洛伊德算法 马踏棋算法 二、算法代码 1 package Algorithm; 2 3 /** 4 * 二分查找非递归实现 默认有序 5 * 6 * @author LEEWAY 7 * 8 */ 9 public class BSAlgorithm { 10 public static int binarySearchN(int[] srcArray, int des) { 11 // 第一个位置. 12 int low = 0; 13 // 最高位置.数组长度-1,因为下标是从0开始的. 14 int high = srcArray.length - 1; 15 // 当low"指针"和high不重复的时候. 16 while (low <= high) { 17 // 中间位置计算,low+ 最高位置减去最低位置,右移一位,相当于除2.也可以用(high+low)/2 18 int middle = low + ((high - low) >> 1); 19 // 与最中间的数字进行判断,是否相等,相等的话就返回对应的数组下标. 20 if (des == srcArray[middle]) { 21 return middle; 22 //