- 博客(260)
- 资源 (3)
- 收藏
- 关注
原创 粤港澳青少年信息学创新大赛 Python 编程竞赛(初中部分知识点整理)
粤港澳青少年信息学创新大赛 Python 编程竞赛(初中部分知识点整理)
2024-05-08 15:40:22 915 1
原创 算法系统学习-轻轻‘撬’开算法的入门
对解决问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每天指令表示一个或多个操作。其实算法并不是个陌生词汇,例如小学的加减乘除中“先算乘除,后算加减”就是四则运算的算法。到后面文章要讲的指数运算,矩阵运算以及其他的代数运算都是一种算法。简单来说:算法就是你解决问题的技巧和方式。2.面向对象方法:所谓的对象是包含数据和对数据操作代码的实体,或者是说在传统的数据结构中加入一些被称为成员函数的过程,因而赋予对象以动作。(因为这个方法是比较主流的编程思想具体不过多阐述)PAD图(问题分析图)伪代码:是用介
2022-07-13 18:17:52 1165
原创 算法系统学习-xdm,时间复杂度到底是个啥?
在不考虑机器对算法的影响,我们对一个算法主要从时间效率和空间效率两个维度上考虑。简单理解是就是执行完该算法所用的时间,一般用bigO表示,它是数量级Order的第一个字母。一个算法转换程序后所耗费的时间,主要取决与算法中执行重复执行的次数,即与语句中的频度有关(下面有详细介绍)(这是学习算法的核心,也是无法绕开的一个问题。)T(n)就是我们常说的时间复杂度,O是数量级的符。虽然上面会有一点点难以理解,但是实际上采用的是 从算法中选取一种对于说研究的问题来说是基本的原操作,以该基本操作在算法中重复执行的
2022-07-13 18:16:55 1052
原创 算法系统学习-牛刀小试几个小Case(非递归算法)
拓展:仅仅依赖于问题规模的时间复杂度,这类问题的操作都具有普遍性,也就是说对所有的数据均等价地处理。(这里问题较为容易)分析:以上三条单个语句的频度都是为1,该算法段的执行时间是一个与问题规模n无关的常数,所以算法的时间复杂度为常数阶 ,即T(n)=O(1);注意:只要不随问题规模n的增加而增长,即使算法中有上千条语句,时间复杂度仍然是一个比较大的常数而已。因此此类算法的时间复杂度为O(1)分析:当有若干个循环语句时,算法的时间复杂度是由于嵌套层数最多的循环语句中最内成循环的频度 f(n
2022-07-13 18:15:21 294
原创 算法系统学习-最最简单递归算法分析和迭代法
构造算法中的两个步骤:递归算法如下(以n=3为例) 调用过程为:f(3)--f(2)--f(1)--f(2)---f(3)---- 递归 -->-------回溯------->递归调用其实是一个降低规模的过程,和一般算法一样,算法的起始模块通常也是终止模块。当规模降为1 时,即递归到f(1)时,满足停止条件停止递归,开始回溯并计算。先将递归算法简化成对应的递归方程,然后通过反复迭代,将递归方程的右端变换成一个级数,最后求级数的和。再估计和的渐近阶,或者,不求级数的和耐而直接估计级数的渐近阶,从而达到对递归
2022-07-13 18:13:50 633
原创 算法系统学习-兔子生兔子(迭代算法-正推法)
也称是一种不断用变量的旧值递推出新值的解决问题的方法。一般用于数值计算,常见的累加,累乘都是迭代算法策略的基础应用。递推法算法是最基本的表现形式,从小规模的问题推解出大规模问题的一种方法,也称其“正推”。如累加过程就是求出前n-1项和的基础上推出前n项和的,递推公式是Sn=Sn-1 +An。 由于无须保存每次的累加结果。所以用一个迭代变量s存储每次的累加结果,累加对象存储在变量a中,这样的递推公式就抽象成 “循环不变” 的累加式: S=s+a用枚举法:将问题的求解过程以及各种不同情况一一列举出来,从中发现解
2022-07-13 18:12:41 825
原创 算法系统学习-正的麻烦反着来呗!(迭代算法-倒推法)
所谓的倒推法,是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法,正向推理比较麻烦时,反而在逆向推理中更加巧妙地解决问题。一只小猴子摘了若干个桃子,每天吃总数的一半多一个,到第十天的时候就剩一个桃子,请问原来有多少桃子?每天的桃子总数为a10=1, a9=(1+a10)*2, a8=(1+a9)*2, .....由于每天的桃子数只依赖前一天的桃子数,所以用一个迭代变量代表桃子个数就可以了ai=(1+ai)*2 i 取值为9,8,7,6,5,4....1由一个简单的小case对倒推法有一个简..
2022-07-13 18:11:49 546
原创 算法系统学习-在吗?百钱买百鸡呗?(蛮力法)
基于计算机运行速度快的这一特性,在解决问题时采用的一种“懒惰”策略。这种策略不经过思考,把问题的所有情况和所有过程交给计算机一一尝试,从中找出问题的解。我们常用的:选择,冒泡,插入,顺序查找,朴素的字符串匹配等。比较常用的还有枚举法,穷举搜素算法等等。枚举法也称穷举法,是蛮力策略的一种表现形式,也是一种使用非常普遍的思维方法。它是根据问题中的条件将可能的情况一一列举出来,逐一尝试从中找到满足问题条件的解。用该方法通常要确定数值取值范围和找出约束条件。百元百鸡“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,
2022-07-12 09:49:41 927
原创 算法系统学习-水仙花数是啥花?(蛮力算法补充)
首先水仙花必须是三位数,那么为数据的范围自然而然是【100,999】,可知每个数都是三位数,那只需要令a,b,c分别等于三个数,然后求出它们的立方和是否等于这个三位数,如果是则就是水仙花数。那只需要枚举这个区间内所有的数,统计水仙花数的个数即可。完数问题Case2:判断两个数正整数之间完数的个数算法分析:根据定于预处理的枚举出1-10000以内的完数有哪些,然后用各数ans【i】存1~i以内的完数个数,这样就可以直接判断某个区间内的完数个数。 比如区间【a,b】那答案就是ans【b】-
2022-07-12 09:48:53 278
原创 算法系统学习-大事化小,小事化了(分而治之)
主要的设计思想是:将一个难以解决的大问题,分割成几个规模较小的相似问题,逐个击破。其实这个算法并不陌生,在数据结构中很常见例如:折半查找,合并排序,快速排序,二叉树遍历(先左后右),二叉树排序树的查找算法。可以用一个递归过程表示,分治法就是一种大规模问题与小规模问题关系的方法,是递归设计方法的一种具体策略,分治法在每一层递归上一般分为三个步骤:老板有一袋金块(共n块)。最优秀的雇员得到其中的最重的一块,最差的雇员得到最轻的一块,假设有一台比较重量的仪器,请使用最少的比较次数找出最重的金块比较简单的方法是逐个
2022-07-12 09:47:35 533
原创 算法系统学习-找第k小值(非等分分治)
现实中常见的应用就是寻找中值元素(中值是一个很有用的统计量,例如中间工资,中间年龄,中间重量等),因此经常会遇到在“一组数据中取第k小的值”。按照以前的最好的排序算法的复杂性是O(nlogn),但我们可以利用二分法将复杂度降为O(n),可这个二分法不是简单典型的二分法分解成完全独立,相似的两个问题,因为在选出分解后第一组的第k小的数据和第二组的第k小的数据,不能保证这两个数据之一是原问题的解。求一组数的第二小的数在用二等分法分解的两个子集中,无论只选取第二小数据或只选取最小的数据,合并处理后都有可能得不到原
2022-07-12 09:46:34 643
原创 算法系统学习-老板找零,别找那么多张(贪心算法)
假设有面值 5元,2元,1元,5角,2角,1角的货币,需要找给顾客4元6角现金,但必须要求付出货币数量最少。在付款问题中,每一步的贪心选择中,在不超过应付金额的条件下,只能选择面值最大的货币,而不去考虑在后面看这种选择是否合理,而且它还不会改变决定,一旦选择了一张货币,就永远选定,也就是无后性贪心算法其实在数据结构中也常见到:霍夫曼树,构造最小生成树的Prim算法和Kruskal算法。贪心算法没有固定的算法框架,核心在与贪心策略的选择,一定要注意的是选择的贪心策略要具有无后性(即某阶段的状态确定过后,不受这
2022-07-12 09:45:12 578
原创 算法系统学习-贪心策略(可绝对贪婪问题详解)
在位数固定的前提下,让高位的数字尽量小,其值就越小,依据贪心策略就可以解决这个问题。但是数据的不同也会造成不同种情况的出现,例如 假设1,假设2,假设3n=“12435863” s=2(去掉两个数)开始最后输出 12356 为最小数结束因此,可得相邻数字只需要从前向后比较;n=“231183” s=3(去掉三个数)开始最后输出 113 为最小数结束因此,可得当第i位与第i+1位比较,若删除第i位后,必须向前考虑第i-1位与第i+1位进行比较,才能保证结果的正确性。假设3:n=“123456” s=3(去掉三
2022-07-12 09:44:31 1035
原创 算法系统学习-取数先取如何必定获胜?(相对或近似贪心)
有AB 两个人轮流取2n个数中的n个数,取数之和大者为胜,若相同则先取者胜。请用算法让先取数的人胜(取数时只能看到2n个数的两边的数,即每次都只能看到该头和尾)假设这组数为:6,16,27,6,12,9,2,11,6,5。用贪心策略每次两人都取两边的数中较大的一个数用贪心算法的情况来看:假设A,B两人取数,每次都只能取两边,那么6,16,27,6,12,9,2,11,6,5,先取者胜,以A先取,取数结果为:所以A胜出但是如果数据的不同也将会影响结果假设这组数据为:16,27,7,12,9,2,11,6 如果
2022-07-12 09:43:27 2038 1
原创 HashMap详细讲解
HashMap最早出现在JDK1.2中,是基于Map接口的实现,储存的内容是键值对(key-value),HashMap中的键和值都可以为null。HashMap的实现并不是同步的,也就是说它不是线程安全的。在JDK1.8中,HashMap的数据结构为,红黑树是HashMap在JDK1.8新引入的数据结构,主要是为了解决链表过长导致查询效率变成O(n)的问题。当插入一个键值对时,HashMap会根据key计算出hash,再根据hash确定在数组中的位置,如果发生hash碰撞,将使用链表的形式储存,当链表过长
2022-07-12 09:41:26 256
原创 排序算法-基数排序详细讲解(RadixSort)
public static int getNumLength(int num){ if(num == 0) return 1; int count = 0; for (int i = num; i != 0; i /= 10) { count++; } return count; } public static void RadixSort(int[] array){ in
2022-07-12 09:37:22 253
原创 排序算法-桶排序详细讲解(BucketSort)
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。为了使桶排序更加高效,我们需要做到这两点:同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。 public static void bucketSort(int[] arr){ if (arr.lengt
2022-07-12 09:36:22 710
原创 排序算法-计数排序详细讲解(CountSort)
前提是确定了取值范围有限的数组,利用数组下标来确定元素的正确位置时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性O(n+k)O(n+k)O(n+k)O(k)稳定当数列最大和最小值差距过大时,并不适合做计数排序当数列元素不是整数时,也不适合用计数排序...
2022-07-11 17:21:33 325
原创 排序算法-归并排序详细讲解(MergeSort)
归并,指合并,合在一起。归并排序(Merge Sort)是建立在归并操作上的一种排序算法。其主要思想是分而治之。若将两个有序集合并成一个有序表,称为2-路归并,与之对应的还有多路归并。借助一个辅助空数组,把左右两边的数组按照大小比较,按顺序放入辅助数组中即可。以下面两个有序数组为例:public static void mergeSort(int[] arr){ if (arr == null || arr.length<2){ return;
2022-07-11 17:20:49 18067 8
原创 排序算法-堆排序详细讲解(heapSort)
每次将堆顶元素取出,与末尾元素交换,调整前n-1个元素,使其仍然成堆,重复上述过程,直到剩余元素为1时为止,即可得到非递减序列 public static void downAdjust(int [] array,int parentIndex,int length){ //temp保存父节点值,用于最后的赋值 int temp=array[parentIndex]; int childIndex=2*parentIndex+1; while
2022-07-11 17:20:13 296
原创 排序算法-选择排序详细讲解(selectSort)
1.找到数组中最大(或最小)的元素2.将它和数组的第一个元素交换位置(如果第一个元素就是最大(小)元素那么它就和自己交换)3.在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序public static void selectionSort(int[] arr){ //清洗数据 if (arr == null || arr.length<2) { return; }
2022-07-11 17:19:32 304
原创 排序算法-希尔排序详细讲解(ShellSort)
一种基于插入排序的快速的排序算法。简单插入排序对于大规模乱序数组很慢,因为元素只能一点一点地从数组的一端移动到另一端。希尔排序为了加快速度简单地改进了插入排序,也称为缩小增量排序。是一种不稳定排序算法希尔排序是把待排序数组按一定的数量分组,对每组使用直接插入排序算法排序;然后缩小数量继续分组排序,随着数量逐渐减少,每组包含的元素越来越多,当数量减至 1 时,整个数组恰被分成一组,排序便完成了。这个不断缩小的数量,就构成了一个增量序列,这里的数量称为增量(其实也叫步长)public static void
2022-07-11 17:18:49 477
原创 排序算法-插入排序算法详细讲解(InsertSort)
每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到全部待排序记录全部插入为止。类似于打牌时插入,时间复杂度为O(n^2),是一种稳定排序。
2022-07-11 17:18:14 414
原创 排序算法-冒泡排序详细讲解(BubbleSort)
把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或等于右侧相邻元素时,位置不变。冒泡排序是一种稳定的排序(稳定的定义,如果相同的元素在排序前和排序后位置不变则稳定),平均时间复杂度为 O(n^2)public static void bubbleSort(int array[]){ for(int i=0;i<array.length;i++){ for(int j=0;j<array.length-1-i;j++){
2022-07-11 17:17:05 1047
原创 排序算法-快排详细讲解(QuickSort)
快速排序作为经典的排序算法之一,其实也用到了冒泡排序的思想,冒泡排序是每一轮将最大(最小)的元素放到一端,而快速排序是每一轮找出比基准元素大、小的所有元素,然后放在基准元素的两边。是分治法体现之一。只从数组的一边对元素进行遍历和交换。首先选定基准元素pivot,同时,设置一个mark指针指向数列起始位置,这个mark指针代表 小于基准元素的区域边界/** * * 单边循环法 * */ public static void quickSort(int []
2022-07-11 16:57:31 1551
原创 JVM运行时数据区
Java虚拟机在执行程序的过程会把它管理的内存划分为若干个不同的数据区。这些数据区有些是随着虚拟机进程的启动而一直存在的,有些区域则是依赖线程的启动和结束而创建和销毁的。程序计数器可以看做是当前线程所执行的字节码的行号指示器,在Java虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来读取下一条需要执行的字节码指令。如果当前线程正在执行的是一个Java方法,这个计数器记录的值就是正在执行的字节码指令地址,如果是在执行本地方法,这个计数器的值为空(Undefined)。值得注意的是,这块区域是
2022-07-11 16:51:46 117
原创 常用的JVM参数和命令
-version -help -server -cp非标准参数,不同JDK版本可能不同设置采用解释器/JIT编译器使用最多的参数,非标准化参数。主要用于JVM调优和debug格式:-XX:[+/-] 表示启用或禁用name属性(+表示启用,-表示禁用) 如:-XX:+UseG1GC 表示启用G1垃圾收集器格式:-XX:= 表示name属性的值为value 如:-XX:MaxHeapSize=100M 表示最大堆空间为100M-Xms1000: 初始堆内存大小,等价于-X......
2022-07-11 16:47:57 3011
原创 Kettle中转换组件使用
1、转换是转换里面的第四个分类。转换属于ETL的T,T就是Transform清洗、转换。ETL三个部分中,T花费时间最长,是一般情况下这部分工作量是整个ETL的2/3。2、Concat fields就是多个字段连接起来形成一个新的字段。3、 值映射把字段的一个值映射成其他的值。在数据质量规范上使用非常多,比如很多系统对应性别gender字段的定义不同。4、增加常量在本身的数据流里面添加一列数据,该列的数据都是相同的值。5、增加序列给数据流添加一个序列字段。6、字段选择从数据流中
2022-03-12 23:32:18 2774
原创 Kettle的转换概念和七大特点详细讲解
概念转换包括一个或多个步骤,步骤之间通过跳(hop)来连接。跳定义了一个单向通道,允许数据从一个步骤流向另一个步骤。在Kettle中,数据的单位是行,数据流就是数据行从一个步骤到另一个步骤的移动。步骤是转换的基本组成部分,以图标的形式出现。如(表输入、文本文件输出)。步骤将数据写到与之相连的一个或多个输出跳,再传送到跳的另一端的步骤。这说明,跳是步骤之间带箭头的连线, 其实是两个步骤之间的,被称为行集(rowset)的,数据行缓存。(行集的大小可以在转换里定义)一个步骤的数据发送可以设置为轮
2022-03-02 20:04:01 3378
原创 Kettle的安装和基本概念了解
1、什么是ETL?ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以了解并掌握一种etl工具的使用,必不可少具体详情不懂的ETL可以看我往期博客,点击这里2、什么是Kettle?Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放
2022-03-02 20:03:14 1728
原创 数据处理中的ETL概念
ETL概念ETL是数据抽取(Extract)、清洗(Cleaning)、转换(Transform)、装载(Load)的过程。是构建数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。一、数据的抽取(Extract)这一部分需要在调研阶段做大量的工作,首先要搞清楚数据是从几个业务系统中来,各个业务系统的数据库服务器运行什么DBMS,是否存在手工数据,手工数据量有多大,是否存在非结构化的数据等等,当收集完这些信息之后才可以进行数
2022-03-02 19:32:05 3682
原创 操作数据存储(ODS)和数据仓库(DW)的区别与联系
操作数据存储(ODS)和数据仓库(DW)的区别与联系基础概念:(抓住重点:DW是反映历史变化,ODS是反映当前变化)数据仓库(Data Warehouse /Enterprise Data Warehouse简称EDW企业级数据仓库):是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。时效:T+1操作
2022-03-02 19:27:49 2614
原创 数据库DB与数据仓库DW区别和联系
数据库(DB)和数据仓库(DW)的区别与联系数据库与数据仓库基础概念:数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。OLTP和OLAP概念补充:数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line
2022-03-02 19:26:58 1979
原创 Mac M1 Nacos 网站无显示,nohup: /Library/Internet: No such file or directory和更换JAVA_HOME配置
mac系统里自带的jdk!!mac系统里自带的jdk!!mac系统里自带的jdk!!因为这个问题最近遇到了很多bug, 特此记录一下查看java版本java -version此时显示的版本是你在bash_profile 中配置的版本,如果没有就说明无jdk版本注意mac是自带的java版本的,我的mac m1芯片自带1.7如果想要更新的版本就自己下载一个查看jdk安装路径直接cd /Library/Java/JavaVirtualMachinesmac中自带的jdk和安装都这个文
2022-02-28 16:32:11 995
原创 烧点脑子使劲看--垃圾回收算法
theme: vuepress「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」标记-清除算法 标记-清除算法是最早出现也是最基础的垃圾回收算法。该算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一清除被标记的对象。也可以反过来,标记所有存活的对象,然后清除所有未标记的对象。该算法有两个缺点:执行效率不稳定...
2022-02-25 18:43:12 81
原创 烧点脑子使劲看--HashMap源码分析(下)
theme: cyanosis「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」四、构造方法HashMap一共有四个构造方法4.1 HashMap()空参构造,构造一个空的HashMap,初始容量默认为16,负载因子默认0.75。javapublic HashMap() { this.loadFactor = DEFAULT_LO...
2022-02-24 19:37:19 44
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人