![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 88
归海一刀之渔舟唱晚
这个作者很懒,什么都没留下…
展开
-
如果有一个500G的超大文件,里面都是数值,如何对这些数值排序?
首先,对于这个这样一个问题,我们肯定不能直接一次性全部将数据加载到内存里面。解决思路:1.先将这个文件里面的值拆分成多个文件,每个文件大小差不多512M。2.在这1000个小文件里面的值进行排序去重分两种情况:① 如果里面的数值不是很大,这样拼接1000文件数值,拼接,去重,排序。对于8G的内存计算机应该是可以处理的。② 文件里面的数值就是坑爹的大。3.对于②处理也很简单,对于1000小文件,比如...原创 2018-02-27 11:31:06 · 10254 阅读 · 6 评论 -
源码解读--线程池TheadPoolExecutor深入讲解
在使用线程的,我们常使用线程池,线程的复用可以减少线程的开销,很好的提高cpu资源利用率。这篇文章信息量会很大,做好准备哦~ java源码系列。 有对线程池没有直观感觉的同学可以看看这篇文章。在jdk8中,从ThreadPoolExecutor从发,来逐步讲解它的源码实现。1.线程池定义初始值private final AtomicInteger ctl = new AtomicI...原创 2018-04-18 01:01:32 · 2506 阅读 · 0 评论 -
源码解读--LinkedList
一.序言在上一篇队列中,只讲解了基本原理,今天就来聊聊队列的一个实现,也是面试中经常和ArrayList对比的一个类--LinkedList。java源码系列。他们的不同点:1.实现结构不同。ArrayList 是基于数组的list。LinkedList是基于链表的list。2.初始容量不同。ArrayList初始容量是10,之后按1.5倍扩容。LinkedList没有初始容量一说。3.访问方式。...原创 2018-04-05 23:32:28 · 257 阅读 · 0 评论 -
什么是java中的CAS
问题一:java中的CAS是什么?问题二:为什么要使用CAS?问题三:CAS使用中需要注意什么问题? 这里以提问的方式引出话题,下面带大家慢慢了解CAS。1.CAS的含义CAS是compare and swap的缩写,即我们所说的比较交。cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观...原创 2018-04-13 02:39:42 · 43254 阅读 · 10 评论 -
一个队列如何找出倒数第k个值
问题:一个队列如何找出倒数第k个值?解:第一种:如果这个队列是一个单项指针的队列,里面的结构如下 这样的话,可以建两个指针,一个循环到底的时候,控制两次指针相差k个元素,一个指针指向队列尾,另一个指针指向队列倒数第k个元素。第二种:如果这个队列是一个单项指针的队列,里面的结构如下 ...原创 2018-04-19 13:14:30 · 1148 阅读 · 0 评论 -
给一个二维数组,横纵坐标随机,里面数值要么是1,要么是0,统计对角是1的个数
问题:给一个二维数组,横纵坐标随机,里面数值要么是1,要么是0,统计对角是1的个数?解析 :首先说一下,怎样的算对角,框成一个矩形是1的就是对角,四点在直线上的值为1组成矩形就算对角。如下图,框起来的都算对角。统计它里面对角的个数?怎么算呢?1. 如果要是对角,肯定一开始那个值为1,它在数组里面的坐标是i,j,即a[i][j] =1。2.还要计算其他三个点是1,就需要在i,j的基础上往下探测,长度...原创 2018-04-13 23:48:50 · 772 阅读 · 0 评论 -
教你代码实现抢红包功能
一.场景带入抢红包在现实场景中经常见到,你知道如何通过代码来实现吗?一种通常的思路是,一定金额的红包,只要有人过来抢,就在剩余数额内给他分配金额,直到所有钱都分陪完。但是这样有一个问题,最先抢的人,抢到钱多的概率会更大。比如有10块钱,有甲乙丙三个人按顺序抢,甲开始抢,这时他抢红包的数额范围是0到10,平均是5云,假设甲抢了4元。乙开始抢,这时他抢红包的数额范围是0到6元,平均是3元,假设乙抢了4...原创 2018-04-23 22:25:52 · 15014 阅读 · 25 评论 -
java排序---快速排序
一.简介 在排序算法中,快速排序算是里面的佼佼者。它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。这里提到了分割成两部分,使我们想到了分而治之的思想,其实就是让另外两部分分别去实现之前的排序而已。因为要找出关键字,用关键字来分割两部分,所以最好的情...原创 2018-04-27 01:30:58 · 329 阅读 · 2 评论 -
java排序--堆排序
一.简介 上一篇讲了快速排序,这一篇来讲讲堆排序。堆可以借助借助完全二叉树来理解,数值排列按照广度优先算法输出的顺序给出。堆排序分按大堆排序和小堆排序。堆排序就是一趟排序完,最大的值在最前面;而按小堆排序就是一趟排序完,最小的值在最前面。 排序过程为使记录序列按关键字非递减有序排序,则在堆排序的算法中,先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录...原创 2018-04-29 21:48:48 · 553 阅读 · 1 评论 -
通俗易懂的数独算法(java)
数独算法一 绪言 偶尔玩下休闲益智小游戏,一方面可以舒解下心情,另一方面刺激下大脑皮层。百度了一下数独 的起源和概念。说了那么多,看着就累。精简一下就是数字(0-9)填充游戏。不明白的来一张大图。看到了吧,就这样子滴~,先有个直观印象吧。二 规则 往简单点说就3条: 1.每个横列需要1~9数值填充,不能重复。 2.每个纵列需要1~9数值填充,不能重...原创 2018-02-26 10:02:56 · 2345 阅读 · 0 评论 -
源码解读--Queue
上一篇讲了栈,这一篇来简单讲讲队列,这java中,队列比栈啰嗦一点,queue被设计成了一个接口,它分为阻塞式和非阻塞式。阻塞队列与非阻塞队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直...原创 2018-04-04 23:23:47 · 228 阅读 · 0 评论 -
如果一个箱子里面有100个球,有两个玩家,1和2,他们都很聪明,可以随机从箱子里面拿出2或6个球,箱子是透明的并且箱子里面有多少个球他们也可以看得到 ,如果算最后一个球能被谁拿到,谁就是
最近得到了一个很有趣的题目,之前没有考虑清楚,现在有空就拿Java溜了一把。 * 题目: * 如果一个箱子里面有100个球,有两个玩家,1和2,他们都很聪明, * 可以随机从箱子里面拿出2或6个球,箱子是透明的并且箱子里面有多少个球他们也可以看得到, * 如果算最后一个球能被谁拿到,谁就是赢家。 * 问: * 1 谁先拿谁赢 * 2 谁后拿谁赢 * 3 谁先拿谁后拿没有什么必然关系如果这个问题问到...原创 2017-03-15 21:29:36 · 1795 阅读 · 0 评论 -
两个变量实现数值的交换
两个变量实现数值的交换怎么做呢?其实很简单。思路:两个变量需要交换,肯定需要有一个中间变量来做转换,如果不能增加第三个变量,肯定也就只能是有其中一个变量,既做了中间变量,又做了初始变量,还做了转换后的值。正解:比如 a=1;b=2;方法一:a = a+b ; //3;b = a-b; //1a= a-b; //2装逼写法 a= (a+b)-(b=(a+b)-b);方法二:a=a*b; //...原创 2018-03-01 11:18:28 · 607 阅读 · 0 评论 -
随便给1000个数值,查找3个乘积最大的三个数
题目:随便给1000个数值,查找3个乘积最大的三个数补:这个1000个都是正常的自然数,可能是值0 ,0.1,-0.1,1.1,1 ,-1,-1.1, 100 ,-100.23对于这样的题目,感觉就是做数学题,但是在计算机语言中,一切都要按程序来。解析:很明显,我们都知道1以下的数,乘啥都不会大于1算法:1.找出比1大的数的集合。2.取这个集合里面的最大三个数,方法(冒泡,希尔,快速,归并),你想...原创 2018-03-15 14:36:14 · 568 阅读 · 0 评论 -
Map中的hash()
你知道HashMap中hash方法的具体实现吗?你知道HashTable、ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8中hash方法实现的不同以及区别吗?如果你不能很好的回答这些问题,那么你需要好好看看这篇文章。文中涉及到大量代码和计算机底层原理知识。绝对的干货满满。整个互联网,把hash()分析的如此透彻的,别无二...转载 2018-03-13 10:35:20 · 5797 阅读 · 2 评论 -
源码解读--HashSet
一.序言 先说一下HashSet的特性:添加的是对象;值不会重复;内部实现用的是HashMap。java源码系列。老套路,看看图谱,看它是何方神圣。简单的来说,好像没发现什么,就是Set集合而已。二.源码精简一点,和之前一样,只讲解一两个增删查的方法,更深的需要同学们去发掘。1初始化它有五个初始化方法HashSet(),HashSet(Collection),HashSet(int),HashSe...原创 2018-04-07 23:34:10 · 241 阅读 · 1 评论 -
理解红黑树
介绍红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完成查找的数据结构。这个时候,红黑树站了出来。 阅读以下需要了解普通二叉树的插入以及删除操作。 红黑树是在普通二叉树上,对没个节点添加一个颜色属性形成的,同时整个红黑二叉树需要同时满足一下...转载 2018-04-08 23:17:17 · 171 阅读 · 0 评论 -
理解B树
为什么要B树磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行...转载 2018-04-09 09:41:16 · 231 阅读 · 0 评论 -
两个队列实现栈,两个栈实现队列详细解析
栈和队列是两种常用的数据结构,他们的地城实现基本也就两种:数组和链表。数组是是将元素在内存中连续存放,链表是用指针来索引数据。具体请自行google,不是要讲的重点。第一个问题:栈是一种先进后出的数据结构,如何用两个队列来实现栈的功能呢? 要先符合栈的先进后出(后进先出),用一个队列是不行的,必需数量大于1。主要思想如下: 假设有个一串数字a,b,c,d顺序入栈,出来的结果应该是...原创 2018-04-02 13:22:24 · 7534 阅读 · 0 评论 -
源码解读--Stack
今天来说说java里面的栈。栈是一种先进后出或者后进先出的一种数据结构。先来看下图谱。java源码系列。Stack继承了vector,大家都知道vector是线程安全的。为什么是线程安全的呢?因为方法前面用了synchronized修饰。为什么用了synchronized就是线程安全的呢?因为synchronized内部有锁的概念,线程在没有获取的资源的时候放入entry set,获取到了资源就是...原创 2018-04-04 13:08:07 · 442 阅读 · 0 评论 -
算法题:一个圆环上有100个灯泡,灯泡有打开和关闭两种状态,灯泡的状态随机,按一个灯泡的开关,相邻的两个灯泡的状态也发生一次变化。比如暗-亮-暗,按中间灯泡,变化为亮-暗-亮。问设计一道算法,使得所有
算法题:一个圆环上有100个灯泡,灯泡有打开和关闭两种状态,灯泡的状态随机,按一个灯泡的开关,相邻的两个灯泡的状态也发生一次变化。比如暗-亮-暗,按中间灯泡,变化为亮-暗-亮。问设计一道算法,使得所有灯泡最后都亮。解答:第一阶段,如果给100个灯泡编号0~99 ,顺序往下走,如果灯是亮的就不管,灭的就按下后面灯泡使这个灯亮(在第一循环内,也就是还没有从99走到0)。如果都是亮的那正好万事大...原创 2019-04-12 18:57:47 · 4654 阅读 · 3 评论