学习记录
文章平均质量分 75
Ntses
寂静的时候最容易孕育新生
展开
-
计算几何基本知识
矢量的概念线段:设A(x1,y1),B(x2,y2)是平面上任意两点,线段AB上的任一点C(x,y)满足x=x1+(1-) x2y=y1+(1-) y2(0<=<=1)给定两个向量和,以O、A、B、A+B为顶点的平行四边形面积:*=x1y2-x2y1=-(*)矢量加减法设二维矢量P=(x1,y1),Q=(x2,y2)。矢量加法的定义为:P+Q=(x1+x2,y1+y2)。矢量加法的几何意义是以向量P、Q为邻边的平行四边形的对角线矢量减法定义为:P-Q...原创 2022-04-04 22:40:22 · 1523 阅读 · 1 评论 -
关于n的阶乘的有关问题
对于给定的整数n,当n较大时,n!的计算就很复杂,需要通过高精度计算得到结果,显然得到的n!的位数很多。所以定义n的时候最好用long,一般涉及n!的问题有:n!尾部的0的个数是多少? n!是多少位数字? n!最前面的一位数字是几?给定自然数n,依次输出上述3个数值。0<n<.(1!=1,2!=2,3!=6,4!=24,5!=120,6!=720,7!=5040,....)分析n!尾部0的个数是多少:n!可以写为n!=a*10^m.其中,m是n!尾部0的个数,而a是一个原创 2022-04-02 23:57:01 · 540 阅读 · 0 评论 -
图形矩阵(回型&蛇型)
回型矩阵回形矩阵有n行n列;数字按顺时针或者逆时针递增。第一圈:上边界:y不变,x++;右边界:x不变,y++;下边界:y不变,x--;左边界:x不变,y--第二圈:上边界:y+1不变,(x+1)++;右边界:x+1不变,(y+1)++;下边界:y+1不变,(x+1)--;左边界:x+1不变,(y+1)-- static void printN(int n) { int[][] arr = new int[n][n]; int count = 1;原创 2022-04-01 09:43:20 · 2544 阅读 · 0 评论 -
全排列(排列数字)
。先举个例子:1,2,3的全排列有{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。 共6种,这是一个简单的排列组合问题,算法思路:dfs+回溯 。在构造树的过程中dfs,将搜索到的节点入栈(回溯)。栈的作用就是回溯,每访问一个节点-入栈,每退回一个节点-出栈。如果访问到叶子节点就直接输出栈中的所有元素,实现全排列。而在使用递归式时,系统会调用一个叫系统栈的东西来存放递归中每一层的状态,因此使用递归来实现dfs的本质还是栈。那么实现代码的具体思路原创 2022-03-31 07:06:09 · 1250 阅读 · 0 评论 -
质数的判定及筛选
我们都知道在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,也叫素数。质数的判定:我们一开始所选用的最原始的方法如下:boolean is_prime(int n){ if(n<2) return false; for(int i=2;i<n;i++){ if(n%i==0){ return false; } } return true;}这里补充一个新的判定方法——试除法原创 2022-03-29 21:41:24 · 313 阅读 · 0 评论 -
并查集解[合根植物]与[国王的烦恼]
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。主要构成:并查集主要由一个整型数组pre[ ]和两个函数find( )、join( )构成。数组 pre[ ] 记录了每个点的前驱节点是谁,函数 find(x) 用于查找指定节点 x 属于哪个集合,函数 join(x,y) 用于合并两个节点 x 和 y 。普通并查集所维护的关系是:朋友的朋友是朋友。重点是在关注两个人是否连通,因此他原创 2022-03-25 23:53:06 · 375 阅读 · 0 评论 -
二阶差分及[绝世武功]
二阶差分可以看成是:差分数组+等差数列。之前学习的差分法的应用就是在区间内操作,单一的加减一个固定的数字。(b[i]=a[i]-a[i-1],a[0]=0)然后前缀和就是所求的数组了。但是遇到等差数列时就不能这样去解题了。比如对区间[2,6]加上一个首项为a,公差为d的等差数列,就需要对每一个点进行更改。我们设a为原数组,b为一阶差分数组,c为二阶差分数组。当在[l,r]内加上一个首项是s,公差为d,末项为t=s+(r-l)*d的等差数列:对a的影响:此时a数组对b数组的影响:原创 2022-03-24 14:31:44 · 3180 阅读 · 0 评论 -
基于快排的一些优化
在之前我有分享过关于排序算法的学习笔记,里面有提及快速排序。但是在之后发现之前提供的不过是普通快排算法,而在面对一些特殊情况时(例如序列原本就有序、有大量重复元素等等)会进行很多完全不必要的操作,耗费大量时间。为此,学习了一下基于普通快速排序算法一步步进行优化。为了方便阅读,我还是把普通快排的代码放出来吧。 public class qSort { public static void qSort(int[] arr,int low,int high){ int i,j,temp,t;原创 2022-03-22 09:12:44 · 139 阅读 · 0 评论 -
关于贪心算法
贪心算法(Greedy algorithm),又称贪婪算法。是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而使得问题得到全局最优解。贪心的算法的设计就是要遵循某种规则,不断地选取当前最优解的算法设计方法。贪心算法基本概念贪心算法与枚举法的不同之处在于每个子问题都选择最优的情况,然后向下继续进行,且不能回溯,枚举法是将所有情况都考虑然后选出最优的情况。贪心算法,在对问题求解时,不从整体考虑,而是采用一叶障目的选择方式,只选择某种意义上的局部最优解。并且,贪心算法是没有固原创 2022-03-30 19:58:25 · 1757 阅读 · 0 评论 -
二分查找算法
二分查找算法讲解枚举查找也就是顺序查找。实现原理就是逐个比较 a[0:n-1] 中的元素,直到找出元素 x 或搜索遍整个数组后确定 x 不在其中,或者说符合要求的元素在不在数组中。最坏的情况下需要比较 N 次,时间复杂度是 O(n) 线性阶。二分查找也就是折半查找。折半查找是将 N 个元素分成大致相同的两部分。选取中间元素与查找的元素比较,或者与查找条件相比较,找到或者说找到下一次查找的半区。每次都将范围缩小至1/2 所以时间复杂度是 O(log2n),但是二分查找的前提是有序的,一般是从原创 2022-03-19 00:04:35 · 1043 阅读 · 0 评论 -
关于枚举法及组合型、排列型枚举模板
枚举法枚举算法的思想:将问题的所有可能成为答案的解一一列举,然后根据问题所给出的条件判断此解是否合适,如果合适就保留,反之舍弃。枚举算法解题的基本思路:确定枚举解的范围,以及判断条件 选取合适枚举方法,进行逐一枚举,此时应注意能否覆盖所有的可能的解 在枚举时使用判断条件检验,留下所有符合要求的解。枚举算法的一般步骤:根据题目确定枚举的范围,并选取合适的枚举方式,不能遗漏任何一个真正解,同时避免重复。 为了提高解决问题的效率,看题目是否存在优化,将可能成为解的答案范围尽可能的缩小。原创 2022-03-26 21:54:36 · 2560 阅读 · 0 评论 -
打表法与模拟法的使用及简单举例
模拟法和打表法,经常会同时出现,因为打表就要按照题目的意思去模拟。算式问题本题为填空题,只需要算出结果后,将结果填入即可。看这个算式:☆☆☆ + ☆☆☆ = ☆☆☆如果每个五角星代表 1 ~ 9 的不同的数字。这个算式有多少种可能的正确填写方法?173 + 286 = 459295 + 173 = 468173 + 295 = 468183 + 492 = 675以上都是正确的填写法!注意:111+222=333 是错误的填写法!因为每个数字必须是不同的...原创 2022-03-17 15:53:57 · 722 阅读 · 0 评论 -
有关内置模板
迭代器(Iterator)迭代器是 C++ 的知识,并不适用于 Java 和 Python 这两种语言。迭代器的知识点很复杂,实现方式看容器讲解。对于数组我们可以采用指针进行访问,但是对于其他的存储空间连续的数据结构或者说是存储单元我们就需要找到另一种方式来替代指针的行为作用,从而达到对于非数组的数据结构的访问和遍历,于是我们定义了一种新的变量叫做迭代器。定义:迭代器是一种检查容器内元素并遍历元素的数据类型。迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器和原创 2022-03-16 20:44:12 · 497 阅读 · 0 评论 -
差分与前缀和
差分与前缀和是一对互逆的操作,常常用于处理区间问题,差分法是解决区间加减问题,前缀和是解决区间求和问题的常用办法。差分法差分法的应用主要是用于处理区间问题。当某一个数组要在很多不确定的区间,加上相同的一个数。我们如果每个都进行加法操作的话,那么复杂度 O(nm) 是平方阶的,非常消耗时间。如果我们采用差分法,将数组拆分,构造出一个新的拆分数组,通过对数组区间的端点进行加减操作,最后将数组和并就能完成原来的操作。差分法的特点:将对于区间的加减操作转化为对于端点的操作; 时间复杂度为 O(原创 2022-03-20 06:00:00 · 875 阅读 · 1 评论 -
JAVA实现导弹拦截
题目描述某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。输入格式1行,若干个整数(个数≤100000)输出格式2行原创 2022-03-16 15:27:37 · 403 阅读 · 0 评论 -
有关排序算法
简单排序算法简单排序算法包括选择排序、冒泡排序、桶排序和插入排序选择排序基本思想每一次从待排序的数据元素中选出最小(或最大)的一个元素,按照顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。排序过程初始:[5 4 6 8 7 1 2 3]第一趟排序后 1 [4 6 8 7 5 2 3]第二趟排序后 1 2 [6 8 7 5 4 3]第三趟排序后 1 2 3 [8 7 5 4 6]第四趟排序后 1 2 3 4 [7 5 8 6]第五趟排序后 1 2 3 4 5 [7 .原创 2022-03-15 18:50:21 · 233 阅读 · 0 评论 -
递推法与递归法
递推算法的特点一个问题的求解需要大量重复计算,在已知的条件和所求问题之间总存在着某种相互联系的关系,在计算时,我们需要找到这种关系,进行计算(递推关系式)。递推法的关键,就是找到递推关系式,这种处理方式能够将复杂的计算过程,转化为若干步骤的简单重复运算,充分利用计算机运行程序时的时间局部性和空间局部性。递推算法的思想:首要问题是先找到各个相邻数据项之间的递推关系; 递推关系避开了求通项公式的麻烦,且有些题目的通项公式很难求,或者不能进行求解; 将复杂问题分解为若干步骤的简单运算; 一般原创 2022-03-18 06:00:00 · 4774 阅读 · 0 评论 -
散列表的概念、构造方法及冲突处理
简单来说查找算法,就是判断现有数据集合中是否有这个元素,或者是否有满足条件的元素。其中的 Hash 算法(散列表)则可以帮助我们判断是否有这个元素,虽然功能简单,但人家性能高啊。通过在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。相比普通的查找算法来说,仅仅在比较的环节,就会大大减少查找或映射所需要的时间。哈希表(散列表)采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间即称为散列表。下面用一张图给大家展示一下散列表的实现过原创 2022-03-14 15:48:11 · 3771 阅读 · 0 评论 -
栈的实现原理与应用
栈既可以采用链表来表示,也可以采用数组(顺序表)来表示,我们限制的是对于存放数据的存取方式。顺序存储:栈的逻辑结构:栈:只允许在一端进行插入、删除操作的线性表。空栈:不含任何数据元素的栈。允许插入(也称进栈、压栈、入栈)、删除(也称出栈)的一端称为栈顶。小邋遢的衣橱小邋遢 MS.Jinlin 是个爱打扮的公主,他有很多晚礼服如"LALA" "NIHAOMA"、"WOBUHAO"、"NIHAOBUHAO"等众多衣服,可是由于衣服太多他要把它们装进箱子,但是作为公主,肯定是会突发原创 2022-03-13 22:44:52 · 1617 阅读 · 0 评论 -
队列的实现原理与应用
队列队列就是一种对于存取方式限制的组织方式。换一种方式描述的话就是,队列既可以采用链表来表示,也可以采用数组(线性表)来表示,我们限制的是对于存放数据的存取方式。队列先入先出。我们对数据的组织也是以这种方式(打饭排队)进行的。当然数据存储方式还是有两种,一种是顺序存储,一种是链式存储。顺序存储: 链式存储:可为什么链式存储的方式的队列首尾指针与链表头尾刚好相反?=>其实链表存在头插入,尾插入。一般是头插入,即它的表头是用来插入数据的,表尾处的数据才是最先插入的,先入先出原则,所以表尾出原创 2022-03-11 23:06:20 · 910 阅读 · 0 评论 -
链表学习与应用
链表是线性表的链式存取的数据结构,是一种链式存取的数据结构,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:数据域(数据元素的映象)+ 指针域(指示后继元素存储位置),数据域就是存储数据的存储单元,指针域就是连接每个结点的地址数据。 相比于线性表顺序结构,操作复杂。线性表的数据存储方式的内存地址是顺序的,而链式存储的内存地址的是随机分配的,他们每个节点地址之原创 2022-03-10 22:24:10 · 214 阅读 · 0 评论 -
三角形面积计算
已知三条边和外接圆半径,公式为s=a*b*c/(4*R)doubleGetArea(doublea,doubleb,doublec,doubleR){returna*b*c/4/R;}已知三条边和内接圆半径,公式为s=prdoubleGetArea(doublea,doubleb,doublec,doubler){returnr*(a+b+c)/2;}已知三角形三条边,求面积先判断输入的三边数值是否可以构成三角形(两边之和大...原创 2022-02-28 23:33:50 · 1403 阅读 · 0 评论 -
mysql解压版安装及其过程所遇问题
MySQL下载:https://dev.mysql.com/downloads/mysql/用mac的在下拉框里选就好,安装解压后文件位置应该是这样的:data文件夹和my.ini文件手动新建的新建后修改my.ini文件内容:[mysql]# 设置mysql客户端默认字符集default-character-set=utf8[mysqld]# 设置3306端口port = 3306# 设置mysql的安装目录basedir= D:\\Develop.原创 2022-02-23 19:54:25 · 432 阅读 · 0 评论 -
出现k次与出现一次
数组中只有一个数出现了1次,其他都出现了k次。请输出只出现1次的数。不规则进制;进制并非只有2、8、10、16进制2个相同的二进制数做不进位加法,结果为010个相同的十进制数做不进位加法,结果为0k个相同的k进制数做不进位加法,结果为0代码如下:public class Main{ public static void main(String[] args) { int[] arr={2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0}; .原创 2022-02-12 17:01:30 · 339 阅读 · 0 评论 -
运用位运算解题
位运算符在处理整形数值时,可以直接对组成整形数值得各个位进行操作。位运算有:& 与 两个位都为1时,结果才为1| 或 两个位都为0时,结果才为0^ 异或 两个位相同为0,相异为1~ 取反 0变1,1变0>>和<<运算符将二进制位进行右移或者左移操作使用位运算判断数的奇偶性要知道奇数最后一位二进制为 1,偶数最后一位二进制为 0public static boolean isOdd(int i){ //原创 2022-02-12 16:21:00 · 262 阅读 · 0 评论 -
素数的筛选方法
埃氏筛法:其实就是先将2~n的整数写下,依次将最小数的的倍数划去比如先是2,然后将2的倍数(4、6、8、10...)划去,紧接着是3,划去3的倍数(6、9、12、15...)以此类推。如此反复就能枚举你n以内的素数。以第十万零二个素数是多少为题。埃筛法需要先将x个数进行存储,对于开辟空间开多了浪费,少了不够。此时由素数定理可知:给出从整数中抽到素数的概率。从不大于n的自然数随机选一个,它是素数的概率大约是1/ln n。也就是说在不大于n的自然数里,总共的素数为 n/lnn。那么.原创 2022-02-06 23:57:55 · 252 阅读 · 0 评论 -
素数的测试及质因数的分解
检测一个数(n)是否为素数1、最原始最暴力的方法:2~n-1中是否有整数能整除n O(n);2、效率更高的方法:若d是n的约数,那么n/d也是。 所以由n=d*(n/d)可得: d<=根号n 所以只需检测2~根号n之间是否有整数能整除n即可代码模板:public class PrimeNum{ public static void main(String[] args){ boolean res=isPrime(7L);...原创 2022-02-05 17:01:33 · 337 阅读 · 0 评论 -
同余方程组
由上可得两个同余方程可得一个线性方程 ,linearEquation(m1,-m2,a2-a1) 可解出y1代回x=a1+m1y1,得:x0=a1+m1y1 ==> x=x0+k*min(m1,m2),得一个新方程:x=x0(mod min(m1,m2))此处涉及的是逐级合并法,最终的x的结果为上一个x关于最后两式子的m的最小公倍数的同余方程,即x=x0(mod min(m(n-1),m(n)))以POJ-1006生理周期为例题题目描述人生来就有三个生理周期,分别为体力、..原创 2022-02-03 23:23:34 · 1175 阅读 · 0 评论 -
特殊的同余方程——逆元
同余方程 ax ≡ 1(mod n),gcd(a,n)=1时有解。这时称求出的x为a的对模n的乘法逆元。(除以一个数再取模=乘以这个数的逆元再取模)对于同余方程ax ≡ 1(mod n),gcd(a,n)=1的求解就是求解方程ax+ny=1,x,y为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的x。A/B题目描述要求(A/B)%9973,但由于A很大,我们只能给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973)=1)。原创 2022-02-01 22:45:15 · 1010 阅读 · 0 评论 -
求解模线性方程(线性同余方程)
用扩展欧几里德算法求解模线性方程的方法:同余方程ax≡b(mod n)对于未知数x有解,当且仅当b是gcd(a,n)的倍数。且方程有解时,方程有gcd(a,n)个解。求解方程ax≡b(mod n)相当于求解方程ax+ny=b,以典型例题为例:青蛙的约会两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙原创 2022-01-31 11:28:07 · 442 阅读 · 0 评论 -
快速幂与矩阵快速幂
模计算除以m的余数,叫做对m取模将a,b对m取模的结果相同,记为a≡b(mod m),即a mod m == b mod m如果a≡b(mod m),且c≡d(mod m):a+b ≡ c+d (mod m)a*b ≡ c*d (mod m)模幂运算模幂运算就是在一个模下计算一个幂的值(先进行幂运算,再进行模运算),即计算(a^r) mod m (a,r和m是正整数)(1)模幂运算1——累次计算法:d=(a^r)mod m =(…((((a mod m)* a).原创 2022-03-28 11:21:34 · 575 阅读 · 0 评论 -
欧几里德算法解一步之遥
从昏迷中醒来,小明发现自己被关在X星球的废矿车里。矿车停在平直的废弃的轨道上。他的面前是两个按钮,分别写着“F”和“B”。小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。按F,会前进97米。按B会后退127米。透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。或许,通过多次操作F和B可以办到。矿车上的动力已经不太足,黄色的警示灯在默默闪烁...每次进行 F 或 B 操作都会消耗一定的能量。小明飞快地.原创 2022-01-30 12:08:07 · 146 阅读 · 0 评论 -
欧几里德算法及其扩展
欧几里德算法其实就是辗转相除法,求最大公因数。具体做法是:用较大数除以较小数,再用所得的余数(第一余数)去除除数,再用所得的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是这两个数的最大公约数。记gcd(a,b)为整数a和b的最大公因数。public static int gcd(int m,int n){ return n == 0 ? m :gcd(n,m%n);}欧几里德算法的扩展——裴蜀(贝祖)等式对任何整数a,b和它们的最大公约数d,关于原创 2022-01-29 23:57:47 · 489 阅读 · 0 评论 -
汉诺塔游戏
汉诺塔游戏是递归中的经典问题。简单来说就是将若干碟子按照要求移动到目标位置。大致过程如下图:原创 2022-01-27 12:48:38 · 2638 阅读 · 0 评论