数组公式

顺序表练习(四):上三角矩阵的压缩存储公式推导以及代码实现

孤者浪人 提交于 2020-01-23 05:50:19
前言 本篇博客会较为详细地讲一下我个人对三角矩阵压缩存储公式的理解,希望能给后面的朋友们带来一些帮助。 等差数列的求和公式 由于三角矩阵的压缩存储公式是依靠求和公式来推导的,所以得先补一下等差数列的求和公式。 求和公式一: 其中n是整个数列的项数, 是数列的首项,d是数列的公差(递增数列公差为正数,递减数列公差为负数)。 求和公式二: 其中n为整个数列的项数, 是数列的首项, 是数列的末项。下面主要用到这个公式二。 上三角矩阵压缩储存公式的推导 首先我们知道,压缩储存上三角矩阵,本质上就是将矩阵的上三角块的元素“展开”成一条长的数列存在数组里。问题就在于,我们 如何根据原矩阵里元素的行号和列号得到压缩后数组里对应的下标? 我们可以这样考虑: 对于一个上三角块里第i行第j列的元素 ,它在数组里的下标就等于(在原矩阵中)他前面i-1行的元素数量 + (原矩阵中)他所在行的他前面的元素数量 ,以下面这个矩阵为例, 在数组里的位置就应该是它前面两行元素的数量5+4=9,再加上 所在行它前面的元素数量1(即是 ),最终结果10即是 在数组中的位置(当然,转换成物理下标的话还需要-1)。 那么问题又来了, 我们如何才能知道前面1到i-1行的元素数量? 这个时候就要用到我们的等差数列求和公式了,我们可以从上到下地将每行的 元素数量 看成一个数列,对于上图的矩阵来说,这个数列就是5 4 3 2 1

switch,数组,随机点名器案例

别等时光非礼了梦想. 提交于 2020-01-23 03:34:27
Java基础语法 1、流程控制语句switch 2、数组 3、随机点名器案例 01switch语句解构 1 * A:switch语句解构 2 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。 b:格式如下: 1 swtich(表达式){ 2 case 常量1 : 3 要执行的语句; 4 break; 5 6 case 常量2 : 7 要执行的语句; 8 break; 9 10 case 常量3 : 11 要执行的语句; 12 break; 13 14 default: 15 要执行的语句; 16 break; 17 } 1 c: 执行流程: 表达式,和case后面的常量进行比较和哪个case后的常量相同,就执行哪个case后面的程序,遇到break,就全结束 2 3 * d: 关键字: switch case default break 4 5 * e:举例 6 如果等于1,则输出星期一 7 如果等于2,则输出星期二 8 如果等于3,则输出星期三 9 如果等于4,则输出星期四 10 如果等于5,则输出星期五 11 如果等于6,则输出星期六 12 如果等于7,则输出星期天 02switch语句的星期判断 1 A: switch语句的星期判断 2 * a: 明确需求 3 需求:初始化int类型变量(1-7)代表星期几,使用switch语句进行判断

LeetCode All in One 题目讲解汇总(持续更新中...)

对着背影说爱祢 提交于 2020-01-23 01:29:50
Given a positive integer n , return the number of all possible attendance records with length n, which will be regarded as rewardable. The answer may be very large, return it after mod 10 9 + 7. A student attendance record is a string that only contains the following three characters: 'A' : Absent. 'L' : Late. 'P' : Present. A record is regarded as rewardable if it doesn't contain more than one 'A' (absent) or more than two continuous 'L' (late) . Example 1: Input: n = 2 Output: 8 Explanation: There are 8 records with length 2 will be regarded as rewardable: "PP" , "AP", "PA", "LP", "PL", "AL"

数组分割

柔情痞子 提交于 2020-01-22 22:27:08
一、题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。 假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然: S(k, 1) = {A[i] | 1<= i <= k} S(k, k) = {A[1]+A[2]+…+A[k]} S(k, i) = S(k-1, i) U {A[k] + x | x属于S(k-1, i-1) } 按照这个递推公式来计算,最后找出集合S(2N, N)中与SUM最接近的那个和,这便是答案。这个算法的时间复杂度是O(2^N). 因为这个过程中只关注和不大于SUM/2的那个子数组的和。所以集合中重复的和以及大于SUM/2的和都是没有意义的。把这些没有意义的和剔除掉,剩下的有意义的和的个数最多就是SUM/2个。所以,我们不需要记录S(2N,N)中都有哪些和,只需要从SUM/2到1遍历一次,逐个询问这个值是不是在S(2N,N)中出现,第一个出现的值就是答案。我们的程序不需要按照上述递推公式计算每个集合,只需要为每个集合设一个标志数组,标记SUM/2到1这个区间中的哪些值可以被计算出来。关键代码如下: #include<iostream> using namespace std; //有一个没有排序

Ndarray对象

主宰稳场 提交于 2020-01-22 19:56:20
Ndarray对象 文章目录 Ndarray对象 一、关于 Ndarray 二、创建公式 三、使用 本文参考来源: https://www.yiibai.com/numpy/numpy_ndarray_object.html 一、关于 Ndarray NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。 ndarray 中的每个元素在内存中使用相同大小的块。 ndarray 中的每个元素是数据类型对象的对象(称为 dtype )。 从 ndarray 对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。 下图显示了 ndarray ,数据类型对象( dtype )和数组标量类型之间的关系。 ndarray 类的实例可以通过本教程后面描述的不同的数组创建例程来构造。 二、创建公式 numpy . array ( object , dtype = None , copy = True , order = None , subok = False , ndmin = 0 ) 上面的构造器接受以下参数: 序号 参数及描述 1. object 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。 2. dtype 数组的所需数据类型,可选。 3. copy 可选

散列表(一).散列表基本内容介绍

耗尽温柔 提交于 2020-01-21 23:57:01
  一说到散列表,大家脑子想到的词就是:Hashmap、key-value、查找速度快、增删速度快等等。确实,在我们平常的学习生活中,散列表是很常见、也是用的很多的数据结构。那么散列表是怎样设计出来的,为什么它既可以和数组一样查询快,又可以和链表一样快增删,本节让我们一起了解一下什么是散列表、什么是散列函数、它究竟是如何设计出来的。 散列思想   什么是散列思想呢?散列表还有一个英文名叫做Hashtable,也叫做“哈希表”、“hash表”,hash我们都了解,是同过一定的算法、hash算法得到一个对象的散列值,用来标识对象本身的算法。   我们来举一个例子,假如有50个同学参加数学竞赛,为了能快速方便地找到每一个人,所以每个人都设立一个编号,从1到50,代表50个学生。现在如果我们用代码去实现这一功能的话,我们可以将这50个学生放到数组中去,从数组下标为1的位置开始,放入编号为1的学生,以此类推,将学生的编号和数组的下标一一对应,当我们要找第32个学生的时候,直接arr[32]就可以找到这个学生了,这样,就达成了O(1)的时间复杂度。实际上,这个例子已经用到了散列思想,能够快速地找到我们想找的学生,如果你觉得不够明显的话我们可以稍加改造一下。   假如,老师说编号这样太简单了,无法明显地表面这个学生的信息,需要再加上年级、班级这些信息,变成了6位数字,比如020433

【数据分析与科学计算可视化】numpy 和 matplotlib库总结

让人想犯罪 __ 提交于 2020-01-21 14:01:51
一、numpy库 numpy:科学计算包,支持N维数组运算、处理大型矩阵、成熟的广播函数库、矢量运算、线性代数、傅里叶变换、随机数生成,并可与C++/Fortran语言无缝结合。树莓派Python v3默认安装已经包含了numpy。 另: scipy:scipy依赖于numpy,提供了更多的数学工具,包括矩阵运算、线性方程组求解、积分、优化、插值、信号处理、图像处理、统计等等。 1.扩展库numpy简介 导入模板:(交换式) >>>import numpy as np 2.numpy库应用于数组 (1)简单数组的生成 >>>import numpy as np #把列表转化为数组 >>> np.array([0,1,2,3,4]) array([0, 1, 2, 3, 4])>>>np.array((0,1,2,3,4)) # 元组转化为数组array([0, 1, 2, 3, 4]) >>>np.array(range(5)) # 把range对象转换成数组 array([0, 1, 2, 3, 4]) >>>np.array([[1,2,3,4,],[5,6,7,8]]) #二维数组 array([[1, 2, 3, 4], [5, 6, 7, 8]]) >>>np.arange(8) # 类似于内置函数range() array([0,1,2,3,4,5,6,7]) >>

动态规划

早过忘川 提交于 2020-01-20 01:39:57
动态规划 Dynamic Programming 一种设计的技巧,是解决一类问题的方法 dp遵循固定的思考流程:暴力递归 —— 递归+记忆化 —— 非递归的动态规划(状态定义+转移方程) 斐波那契数列 暴力递归,看上去很简洁 def fib(n): return n if n <= 1 else fib(n-1) + fib(n-2) 画出递归树分析一下,可以很容易发现有很多重复计算。 重叠子问题 。 递归算法的时间复杂度怎么计算? 子问题个数乘以解决一个子问题需要的时间。显然,斐波那契数列的递归解法时间复杂度为O(2 n * 1),暴力递归解法基本都会超时。 如何解决? 递归 + 记忆化 仍然使用递归,不同点在于,如果重叠子问题已经计算过,就不用再算了,相当于对冗余的递归树进行了剪枝。 由于不存在重叠子问题,时间复杂度为O(n * 1),降到线性。 1 class Solution: 2 def Fibonacci(self, n): 3 # write code here 4 if n <= 1: 5 return n 6 memo = [-1] * (n+1) 7 memo[0], memo[1]= 0, 1 8 9 def helper(n, memo): 10 if memo[n] >= 0: 11 return memo[n] 12 memo[n] = helper(n

JavaScript知识总结

守給你的承諾、 提交于 2020-01-19 16:56:21
1、什么是JavaScript 1.1、概述 JavaScript是一本世界上最流行的脚本语言 一个合格的后端人员,必须要精通JavaScript 1.2、历史 ECMAScript它可以理解是JavaScript的一个标准 目前最新的版本是es6 但是大部分浏览器还是只停留在了支持es5代码上 问题:开发环境与线上环境的版本不一致 2、快速入门 2.1、引入JavaScript 1、内部标签 <script> alert("hello world1"); </script> 2、外部引入 abc.js alert("hello world2") index.html <script src="abc.js"></script> 2.2、基本语法入门 演示代码: <script> //数据类型 数据变量名 = 数据变量; var num = 3; if (num > 2) { alert("数字大于2") } else { alert("数字不大于2") } //控制台打印数据 console.log(num) </script> 运行效果: 浏览器必备调试须知: 2.3、数据类型 数值、文本、图形、音频、视频 1、变量 var //仅仅不能以数字开头 2、number ** js不区分小数和整数 123 //整数123 123.1 // 浮点数123.1 123e3 /

shell基础使用

社会主义新天地 提交于 2020-01-18 12:31:15
2、shell 2.1、shell基础正则表达式 ​ 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。并规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式( Regular Expression ) 。 2.1.1、普通元字符 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“ n ”匹配字符“ n ”。“ \n ”匹配一个换行符。串行“ \\ ”匹配“ \ ”而“ \( ”则匹配“ ( ”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“ \n ”或“ \r ”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“ \n ”或“ \r ”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo 能匹配“ z ”以及“ zoo ”。 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“ zo+ ”能匹配“ zo ”以及“ zoo ”,但不能匹配“ z ”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“ do(es)?