- 博客(26)
- 收藏
- 关注
原创 Comparable接口源码分析
/* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package java.lang;import java.util.*;/** * This interface imposes a total ordering on the objec
2021-04-22 15:54:35 287
原创 JVM基础知识和垃圾回收算法
JVM运行时数据区域1.程序计数器内存空间小,线程私有。字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器完成。如果线程正在执行一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是一个native方法,这个计数器的值为(Undefined)。此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError的区域。2.Java虚拟机栈线程私有,生
2021-03-17 16:31:23 150
原创 排序之希尔排序
希尔排序我们都能理解,优秀排序算法的首要条件就是速度。于是人们想了许许多多的办法,目的就是为了提高排序的速度。而在很长的时间里,众人发现尽管各种排序算法花样繁多(选择、冒泡、直插法),但时间复杂度都是 O(n2),似乎没法超越了。此时,计算机学术界充斥着“排序算法不可能突破 O(n2)”的声音,“不可能成为了主流”。终于有一天,当一位科学家发布超越了 O(n2) 新排序算法后,紧接着就出现了好几种可以超越 O(n2)的排序算法,并把内排序算法的时间复杂度提升到了 O(nlogn)。“不可能超越 O(n2
2021-01-27 22:29:48 400
原创 排序之直接插入排序
直接插入排序扑克牌是我们几乎每个人都可能玩过的游戏。最基本的扑克玩法都是一边摸牌,一边理牌。假如我们拿到了这样一手牌,如图所示。啊,似乎是同花顺呀,别急,我们得理一理顺序才知道是否是真的同花顺。请问,如果是你,应该如何理牌呢?将 3 和 4 移动到 5 的左侧,再将 2 移动到最左侧,顺序就算是理好了。这里,我们的理牌方法,就是直接插入排序法。1.直接插入排序算法直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数
2021-01-26 22:12:09 643
原创 排序之简单选择排序
简单选择排序爱炒股票短线的人,总是喜欢不断的买进卖出,想通过价差来实现盈利。但通常这种频繁操作的人,即使失误不多,也会因为操作的手续费和印花税过高而获利很少。还有一种做股票的人,他们很少出手,只是在不断的观察和判断,等到时机一到,果断买进或卖出。他们因为冷静和沉着,以及交易的次数少,而最终收益颇丰。冒泡排序的思想就是不断地在交换,通过交换完成最终的排序,这和做股票短线频繁操作的人是类似的。我们可不可以像只有在时机非常明确到来时才出手的股票高手一样,也就是在排序时找到合适的关键字再做交换,并且只移动一次就
2021-01-26 20:56:22 533
原创 排序之冒泡排序
冒泡排序先上图感受一下什么是冒泡:好了,进入正文1.最简单的排序实现冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序为止。冒泡的实现在细节上可以有很多种变化,本文我给出了 3 种不同的冒泡实现来跟大家一起讨论学习。从简单的开始:/* 对顺序表 L 作交换排序(冒泡排序的初级版) */void BubbleSort(SqList *L) { int i, j, temp; for (i = 1; i < L-&g
2021-01-25 22:21:56 636
原创 栈的应用之递归,以斐波那契数列为例
栈的应用——递归在讨论栈的应用之前,先来看看栈的作用,用数组和链表直接实现功能不就行了吗,为啥还需要引入栈呢,哈。人明明有腿脚,又能走又能跑,干嘛还有乘坐交通工具呢。其实栈的引入简化了程序设计的问题,划分了不同的关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。反之,像数组等,因为要分散精力去考虑数组的下标增减等细节问题,反而掩盖了问题的本质。所以现在许多高级语言,如 Java、c# 等都有对栈结构的封装,使得我们可以不用关注它的实现细节,就可以直接使用 Stack 的 push 和 pop 方
2021-01-20 22:31:44 1860
原创 两栈的共享空间
两栈的共享空间栈的顺序存储有一个很大的缺陷,就是必须事先确定数组存储空间大小,万一不够用了,就需要编程手段来扩展数组的容量,非常麻烦。对于一个栈,我们也只能尽量考虑周全,设计出合适大小的数组来处理,但对于两个相同类型的栈,我们却可以做到最大限度地利用其事先开辟的存储空间来进行操作。如果我们有两个相同类型的栈,我们为它们各自开辟了数组空间,极有可能是第一个栈已经满了,再进栈就溢出了,而另一个栈还有很多的存储空间空闲。发生了不平衡,这时,我们完全可以用一个数组来存储两个栈,只不过需要点小技巧。如下图,数组
2021-01-20 21:31:01 763
原创 今天把 栈的顺序存储结构 和 链式存储结构 聊个通透!
三遍定律:对栈比较陌生的同学请点击这里对栈比较陌生的同学请点击这里对栈比较陌生的同学请点击这里进入正题1.栈的顺序存储结构及实现(1) 栈的顺序存储结构既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈。线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表,一般把数组下标为 0 的一端作为栈底,因为首元素都存在栈底,变化最小。我们定义一个 top 变量来指示栈顶元素在数组中的位置,这 top 就如同中学物理学过的游标卡尺的游标,它可以来回移动,意味着栈
2021-01-13 22:28:32 664 2
原创 今天我们来谈一谈栈
栈不知道大家有没有玩过手枪,估计都没有。其实我也没有,哈哈!现在和平年代,上哪去玩这种危险的真东西,就是仿真玩具也大都被限制了。几年之前,邻居家一个哥哥(下文就叫科哥吧)曾经当过兵,去他家玩的时候,还真就近距离的跟 枪 接触了一次,哈,当然不是用手摸了,而是学习了一下关于枪的知识。科哥跟我说,早先军官们都爱用左轮手枪,而非弹夹式手枪,知道为啥吗,我不知道啊~~。他说因为子弹质量不过关,有个别可能是臭弹——也就是有问题 的、打不出来的子弹。弹夹式手枪,如果当中有一颗是卡住了的臭弹,那么后面的子弹就都打不了
2021-01-12 22:55:15 501
原创 一文弄懂循环链表、双向链表、静态链表
静态链表、循环链表、双向链表单链表请点击这里1.静态链表C语言具有指针这一强大的功能,也是众多计算机领域的人用来描述数据结构首选C语言的原因之一。指针可以使C非常容易的操作内存中的地址和数据,这比其他高级语言更加灵活方便。Java、C#等面向对象语言,虽然不使用指针,但因为启用了对象引用机制,从某种角度也间接实现了指针的某些作用。但对于其他一些语言,如Basic、Fortran等早期的编程语言对于一些数据结构的操作就没有那么方便了。有前辈想出来用数组来代替指针,描述单链表:首先让数组的元素都是由两个
2021-01-12 21:36:14 3188 10
原创 看完这篇就明白了关于单链表的操作了
单链表的操作1.单链表的读取在线性表的顺序存储结构中,我们要计算任意一个元素的存储位置是很容易的。但在单链表中,由于第i个元素没办法一开始就知道,必须得从头开始找。获得链表第 i 个数据的算法思路:声明一个指针 p 指向链表第一个结点,初始化 j 从 1 开始;当 j < i 时,就遍历链表,让 p 的指针向后移动,不断指向下一个结点,j 累加 1;若到链表末尾 p 为空,则说明第 i 个结点不存在;否则查找成功,返回结点 p 的数据。实现代码算法如下:/* 初始条件:顺序线性表 L
2021-01-10 17:38:11 892
原创 这一篇让你弄懂线性表的链式存储结构
线性表的链式存储结构以及单链表概念本篇内容是线性表链式存储结构的相关概念这里有两篇线性表的干活供大家讨论学习:这里是吐血总结的线性表顺序存储结构点击这里让你彻底弄明白各种链表说明:本文的代码是伪C代码1.顺序存储结构不足的解决方法线性表的顺序存储结构是有缺点的,最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间。能不能想办法解决呢?要解决这个问题,我们就得考虑一下导致这个问题的原因:为什么当插入和删除时,就要移动大量元素,仔细分析后,发现原因就在于相邻两元素的存储位置也具有邻
2021-01-09 16:57:42 3270 3
原创 数据结构之线性表,这一篇就够了,吐血总结,建议收藏~~
线性表及其顺序存储结构痛定思痛,决定吐血总结一下线性表相关的知识,篇幅较多,字数较长,建议收藏学习!另外,请大家多多指教!又到了幼儿园放学的时间,今天天气很不错,光明顶幼儿园门口很多家长来接自己家的小宝贝,只见老师带着小朋友们,一个拉着另一个的衣服,依次从教室出来。而且我发现很有规律的是,每次他们的次序都是一样。比如宋远桥的儿子排在第5个,据说每次他都是在第5个,前面同样是那个小女孩,后面一直是那个小男孩。这点让我很奇怪,为什么一定要这样?后来从老师那里得知,为了保障小朋友的安全,避免漏掉小朋友,所
2021-01-09 14:38:59 16854 14
转载 Kudu遇到的坑,是真的坑~
坑1: Caused by: org.apache.kudu.client.NoLeaderFoundException坑2: Caused by: java.lang.IllegalArgumentException: cannot import authentication data from a different user: old=’’, new=‘liuge’坑3:Exception in thread “main” org.apache.kudu.client.NonRecoverable
2021-01-06 14:54:54 698
原创 spark运行时出现错误Caused by: java.lang.NoClassDefFoundError: org/apache/spark/internal/Logging
一般报这个错是跟下面这个错一起出现的:java.lang.ClassNotFoundException: org.apache.spark.internal.Logging其实不管是 org.apache.spark.internal.Logging类还是 org.apache.spark.sql.SparkSession类等等,这些错误原因都是一样的:<scope>provided</scope>找到 pom 文件中的这个配置 把他注释即可<!--<sc
2021-01-05 22:27:42 3763 1
原创 算法的空间复杂度
算法的空间复杂度我们在写代码时,完全可以用空间来换取时间,比如说,要判断某某年是不是闰年,你可能会花一点心思写了一个算法,而且由于是一个算法,也就意味着,每次给一个年份,都是要通过计算得到是否是闰年的结果。还有另一个办法就是,事先建立一个有2050个元素的数组(年数略比现实多一点),然后把所有的年份按下标的数字对应,如果是闰年,此数组项的值就是1,如果不是值为0。这样,所谓的判断某一年是否是闰年,就变成了查找这个数组的某一项的值是多少的问题。此时,我们的运算是最小化了,但是硬盘上或者内存中需要存储这205
2021-01-02 21:44:05 829
原创 最坏情况与平均情况
最坏情况与平均情况你早晨上班出门后突然想起来,手机忘记带了,这年头,钥匙、钱包、手机三大件,出门哪样也不能少呀。于是回家找。打开门一看,手机就在门口玄关的台子上,原来是出门穿鞋时忘记拿了。这当然是比较好,基本没花什么时间寻找。可如果不是放在那里,你就得进去到处找,找完客厅找卧室、找完卧室找厨房、找完厨房找卫生间,就是找不到,时间一分一秒的过去,你突然想起来,可以用家里座机打一下手机,听着手机铃声来找呀,真是笨。终于找到了,在床上枕头下面。你再去上班,迟到。见鬼,这一年的全勤奖,就因为找手机给黄了。找东西
2021-01-02 21:36:41 294
原创 这一篇让你彻底搞明白各种~~算法时间复杂度!!!
算法时间复杂度1.算法时间复杂度定义在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。这样用大写O( )来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。
2021-01-02 21:25:11 1718 2
原创 函数的渐进增长
函数的渐进增长我们先通过一个例子来看一下,假设两个算法的输入规模都是n,算法A要做2n+3次操作,可以理解为先有一个n次的循环,执行完成后,再有一个n次的循环,最后有三次赋值或运算,共2n+3次操作,算法B要做3n+!次操作,那么这两个算法那个更快呢?我们发现,当n = 1时,算法A的效率不如算法B(次数比B多一次)。而当n = 2时,两者效率相同;当n >2时,算法A就开始优于算法B了,随着n的增加,算法A比算法B越来越好了。我们可以说,算法A总体上要好于算法B。此时我们给出这样的定义,输入
2021-01-02 16:17:22 1375
原创 算法效率的度量方法
算法效率的度量方法在设计算法的时候要想方设法的提高效率。这里的效率大都指算法的执行时间,那么我们如何度量一个算法的执行时间呢?事后统计方法这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。但这种方法是有很大的缺陷的:必须依据算法事先编制好程序,这通常要花费大量的时间和精力。如果编制出来发现它根本是很糟糕的算法,相当于白费力气!时间的比较依赖计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣。算法的测试数据设计困难,并且程序的运
2021-01-02 01:11:37 2193
原创 算法的定义和特性
算法的定义和特性算法定义算法(Algorithm)这个单词最早出现在波斯数学家阿勒.花刺子密所写的《印度数字算术》中。如今普遍认可的对算法的定义是:算法是解决特定问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。算法定义中,提到了指令,指令能被人或机器等计算装置执行。它可以是计算机指令,也可以是我们平时的语言文字。为了解决某个问题或某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每一个操作都完成特定的功能,这就是算法了。算法的特性算法具有五个
2021-01-01 16:15:40 3277
原创 数据结构与算法的关系
数据结构与算法的关系算法:是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。我们在学习数据结构或者谈论到数据结构的时候总是会跟算法扯在一起,就连我的专栏分类名字都叫做数据结构与算法,哈哈。说数据结构与算法之间的关系是什么?我们不妨来打这样一个比方,今天是你女朋友的生日,你打算请你女朋友去看爱情音乐剧,到了剧院,抬头一看——《梁山伯》18:00开演。嗯,怎么会这样?一问才知道,今天饰演祝英台的演员生病,所以梁山伯唱独角戏。噗嗤,这还看啥。于是你们打算去看爱情
2021-01-01 14:34:12 505
原创 数据结构的逻辑结构与物理结构
逻辑结构与物理结构按照角度的不同,我们把数据结构分为逻辑结构和物理结构。逻辑结构逻辑结构是指数据对象中数据元素之间的相互关系,主要分为以下四种:(1)集合结构集合结构中的数据元素除了同属一个集合外,它们之间没有任何关系。如图:(2)线性结构线性结构中的数据元素之间是一对一关系。如图:(3)树形结构树形结构中的数据元素之间存在一种一对多的层次关系。如图:(4)图形结构图形结构的数据元素是多对多的关系。如图:注意:每一个数据元素看做一个结点,用圆圈表示。元素之间的逻辑关系用线表
2020-12-31 17:20:09 2719
原创 数据结构基本概念
数据结构基本概念要想了解数据结构是什么,就需要先知道数据是什么。有句古话说得好:“巧妇难为无米之炊”,再好的计算机,也是需要有“米”才能干活的,否则就只是一堆没用的废料罢了,这个“米”就是数据。数据数据是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅包含数值类型(如整型、浮点型等),还包括非数值类型(如字符、声音、图像、视频等)数据元素数据元素是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。比如,在交通工具
2020-12-31 11:24:49 141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人