Java
文章平均质量分 70
Richard-Cai
这个作者很懒,什么都没留下…
展开
-
求解汉诺塔问题
汉诺塔是经典问题。具体表述为:由很多放置在三个塔座上的盘子组成的一个古老难题,所有盘子直径都是不同的,盘子中央都有一个洞使他们刚好可以放在塔座上。所有的盘子刚开始放在塔座A上面,这个难题的目标是将所有的盘子都从塔座A上移动到塔座C上,每一次只能移动一个盘子,并且任何一个盘子都不可以放在比自己小的盘子之上。如下图所示: 以三个盘子为例,如果以手工进行试验需要移动7次,先后顺序是:Disk原创 2016-09-08 22:14:27 · 598 阅读 · 0 评论 -
链表与迭代器
链表的使用中find操作是常见的,很多时候也需要对链表进行遍历。如果使用迭代器遍历每一个对象,这样就会使数据结构与遍历对象(迭代器)区分开,java中的Iterator作为轻量级对象,创建代价比较小。至少在使用迭代器可以有一下几点好处: 1 迭代器可以提供统一的迭代方式,也就是说对于链表、队列、数组、叉树都可以使用迭代器来时实现迭代。 2 迭代器可以在客户端透明的情况下提供各种不同的原创 2016-09-07 19:14:19 · 3972 阅读 · 0 评论 -
双向链表
前面叙述了关于单链表、双端链表、有序链表的结点插入以及遍历查找等示例。这几种链表都只能从前往后进行遍历,反向遍历是非常麻烦的一件事。 考虑一下下面这个情况:如果文本编辑器用链表来存储文本,当用户向下移动光标时,程序移动到下一个链结点操作新一行,假设链表每个结点存放的是一行字符串。光标向下移动前面所说的几种链表结构已经实现了。但是光标上移就显得复杂,至少在不使用双向链表的前提下没那么向下移原创 2016-09-06 21:40:21 · 829 阅读 · 0 评论 -
有序链表
链表中有时候需要对数据的顺序有所要求,对于一些应用来说链表中保持数据有序是有意义的一件事,下面就围绕有序链表,说明有序链表的创建和利用链表实现排序。 在有序链表插入一个数据项,可以采用之前的插入排序的思想,通过局部有序实现数据的排序。插入数据通常在链表中有三种方式:在链表头部、尾部、中间。这三种方式需要考虑到。有序链表的创建过程 和一般链表创建一样,首先创建一个结点node,包原创 2016-09-05 22:44:46 · 826 阅读 · 0 评论 -
双端链表
双端链表与传统的链表很相似,在基本链表的基础上新增一个特性:对最后一个结点的引用。如下图所示: 与之前说到的链表相比还有一个功能是在表尾直接插入一个链结点,这样就不用普通链表一样通过遍历链表到尾部进行添加数据项了。 双端链表的操作与单链表操作区别除了可以从头部插入数据和删除数据、查找数据以及实现关键数据项的删除等,还可以实现从链表尾部添加数据。以下是代码:class Link1{原创 2016-09-04 13:30:40 · 1319 阅读 · 0 评论 -
数据结构——单链表
链表也是一种常用的数据结构,机制灵活用途广泛,适用于许多通用数据库。讨论一下数组的使用缺陷:1.无序数组搜索效率比较低,有序数组插入效率比较低。无论哪一种删除效率都很低。2。数组大小一旦创建了就不能改变该数组的大小了。链表相对于数组这些缺陷都有一定的改善。链结点通常每个对象中都包含一个对下一个链结点的引用。如下图所示:关于自引用 在定义链表基本结构时会用到自引用,这是建立链表的重要环节。原创 2016-09-03 21:13:14 · 622 阅读 · 0 评论 -
优先级队列
Java实现数据结构之优先级队列。原创 2016-09-02 22:56:35 · 540 阅读 · 0 评论 -
数据结构——队列的使用
队列(Quene)是一种数据结构,与栈不同的是先进先出(FIFO),最先进去的数据最先出来。主要讲解循环队列与缓冲环的使用。原创 2016-08-30 23:33:30 · 3335 阅读 · 0 评论 -
数据结构——栈的使用
栈的基本介绍,使用栈实现字符串反转以及匹配符匹配检测。原创 2016-08-30 22:28:21 · 473 阅读 · 0 评论 -
简单排序:冒泡排序、选择排序、插入排序
冒泡排序、选择排序、插入排序算法分析。原创 2016-07-10 22:56:14 · 1084 阅读 · 1 评论 -
初步认识linux与入门
习惯了使用windows以后接触另外一个操作系统似乎不太习惯,考虑到linux众多优越性,首先就说说为什么学习linux。在接触linux之前先来说说我对linux的理解。1. linux完全开源,免费。 如果你问我当前使用最广的操作系统是啥?肯定绝大多数人会说是windows,没错。微软旗下的windows系列广为流行,而且都是具备图形化界面,用户起来也很方便。但是windows系统是收原创 2016-07-10 18:27:47 · 4613 阅读 · 2 评论 -
递归——单词全排列
递归是编程技术中常用的一种技术,就是方法是支持自己调用自己,在面对过程编程中已经有了递归的接触,像斐波那契序列的求解等这些都是可以用递归来解决的。java方法是支持嵌套调用方法不支持嵌套定义。 使用递归需要注意以下几点:1 递归需要一个基值情况,其意思是导致递归的返回而没有再一次递归调用。2 第一个递归都需要有终止条件。以防止无限递归下去,可能由此引发程序崩溃。以上两点是在递归调用中特原创 2016-09-08 19:21:13 · 1941 阅读 · 0 评论 -
归并排序
归并排序是一种效率较高的排序,与之前说到的三种基本排序:冒泡排序、选择排序、插入排序速度要快。归并排序核心是将归并两个有序的数组,并使它们有序的排列在数组C中。假设有两个有序数组,不要求大小长度一致,假设数组有4个数组项,数组B有6个数据项,需要将他们归并到一个数组C中,以下是归并过程。归并之后的数组C以下是将数组A和数组B归并为数组C的代码:(前提是数组A与B有序)//采用常规思维解决归并排序问题原创 2016-09-09 21:55:13 · 386 阅读 · 0 评论 -
希尔排序
前面说过插入排序,插入排序是三种基本排序中较快的一种,效率最低的是冒泡排序,因为冒泡排序需要反复比较。对于插入排序虽然较快,不过比较复制次数比较多。希尔排序是在插入排序的基础上进行改进,排序速度比插入排序要快。 希尔排序是通过缩小插入排序中的元素之间的间隔,假设是对数组进行排序,可以认为希尔排序首先将对数组进行划分子数组,对每个数组进行插入排序。子数组的划分依据是每个一定的长度h。通过缩短原创 2016-09-10 18:21:52 · 811 阅读 · 0 评论 -
二叉树遍历与删除
前面写过二叉树的节点插入与查找关键数据项以及最值的数据项。二叉树的删除与遍历是另外一项重要的操作。特别是二叉树的人删除比较复杂,分为无子节点的节点删除,只有一个子节点的节点删除和有两个子节点的节点删除三种情况。1. 删除没有子节点的节点 这种情况是三种节点删除中最简单的。因为没有子节点的节点删除时只需要将该节点的左或者右节点的引用置为null即可。其他的基本不用变。可以下图表示:原始二叉树原创 2016-09-20 23:18:31 · 9110 阅读 · 1 评论 -
java虚拟机理解(二)——对象访问机制
接着说java虚拟机,对象创建结束后需要使用对象,就涉及到对对象访问的问题。虚拟机的取指指针在栈上获取对象引用后,就需要到堆上去获取对象实例。对象访问取决于虚拟机实现。主流的java虚拟机采用直接指针的形式进行对象访问。直接地址的对象访问 直接地址访问速度快,栈上的reference引用直接获取堆上的对象实例数据,同时通过堆上到方法区上对象类型数据的指针找到对象类型数据。以下是直接指针访原创 2017-03-22 19:52:45 · 868 阅读 · 0 评论 -
CSDN编辑器markdown字体、颜色与字号的设置
markdown是一种可以使用普通文本编辑器编写的标记语言,通过标记特殊语法生成具有一定格式的内容。在csdn上也写过几篇文章,对于markdown的使用可以说是仅仅使用了这里面最最基本的功能,接触最多的就是输入文字,插入图片以及插入代码。涉及到表格更多的时候就使用外部编辑器进行操作完成后再插入到markdown里面来,虽然很low却很快。还有对于颜色字体以及大小的控制,这次主要总结markdown原创 2016-12-18 23:25:22 · 8853 阅读 · 4 评论 -
在较大数据集中使用java文件处理技术获取目标数据
实验中可能会接触到各种大小的数据库,随着机器学习和深度学习的广泛使用,实验中使用的数据库也越来越大。但是有些原始的开源数据库并不一定适合实验条件,因此需要对数据进行预处理。对于规模达到一定程度的数据库,如何进行处理是一件不好弄的事情。 由于最近在实验中需要对数据集进行预处理,数据集数据量较大,考虑到人工进行数据包的截取比较费力费时,就写了一个数据处理的小工具,处理的核心是对文件的操作,接下来就简单说原创 2016-12-18 21:39:49 · 1314 阅读 · 0 评论 -
git在本地仓库上的使用
git作为一款优秀的版本控制工具受到广大用户的欢迎和喜爱,不管是开发还是项目管理都发挥着重要的作用。前面一篇文章已经简要说了如何在github上注册以及在本地添加SSH秘钥操作,包括在本地通过git指令将需要上传的开源文件传到远程仓库里面去。http://blog.csdn.net/cai2016/article/details/51557682 但有时候仅仅想在本地进行操作,将仓库建立在原创 2016-12-16 16:02:15 · 8719 阅读 · 0 评论 -
哈希表之开放地址的三种方法
hash表作为一种常见数据结构可以提供快速的插入和查找操作,不管哈希表中有多少个数据,插入和删除数据只需要接近O(1)的时间。这是具有非常大的优势。通常使用hash表速度会比树快,因为树需要O(N)时间级。不过hash表是基于数组的,创建后比较难扩展,使用不灵活。这样就注定需要面对动态内存问题,通常的思路是对数组进行扩展,将之前的数据复制到新的数组中并释放原来的内存。 hash表就是key原创 2016-10-03 20:23:10 · 22244 阅读 · 0 评论 -
二叉树
二叉树的优势 在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势,二叉树也是一种常用的数据结构。二叉树的构成 二叉树由节点(node)和边组成。节点原创 2016-09-19 23:09:36 · 51445 阅读 · 10 评论 -
基数排序
基数排序是一种与之前几种排序不同的排序方法,之前的排序是基于关键字排序算法。基数排序属于分配式排序,而且基数排序是稳定排序。以下是基数排序的步骤:假设在一个数组为例,数据中的数据项均小于1000(位数最多是三维)。1 先对数组中所有的数据项个位进行排序,个位数字0~9,从小到大的顺序进行存放(不比较其他位数字大小),结果存放在一个缓存二维数组里面。2 在步骤1的基础之上继续对数据项的十位进行排序(数原创 2016-09-17 19:18:36 · 701 阅读 · 0 评论 -
快速排序
快速排序是一种常见的排序算法,大多数情况下快速排序都是最快的。快速排序本质上是将一个数组划分一个子数组(关于划分前面已经说过),递归调用自身为每一个子数组进行快速排序。 快速排序的过程:以数组为例,针对数组进行排序。1 把数组或者子数组划分为左边(比关键字小的)一组和右边比关键字大的一组。2 调用自身对左边一组进行排序。3 再次调用自身对右边的一组进行排序。4 不断递归循环以上步骤,子数原创 2016-09-16 22:20:26 · 600 阅读 · 0 评论 -
划分
接触快速排序之前首先需要了解划分。划分就是将数据划分为两组,比关键字大的划分在一组,比关键字小的划分在另外一组。 划分算法可以理解是两个指针操作的进程。开始时指针分别指向数组头部和尾部(以数组为例,通常数组是没有头部和尾部所谓的,这里是简单描述这个问题),操作的过程是以下几个流程:1 初始化leftPtr(向右检索的指针)在数组最左端,rightPtr指针在数组最右端。2 leftPtr原创 2016-09-15 15:42:03 · 506 阅读 · 0 评论 -
有序数组之二分查找
数据结构与算法是程序深入设计需要理解的知识。关于数据结构和算法就从最简单的部分开始了。来看第一个问题:数组的二分查找。 数组是我们常见的数据结构,在程序设计中应用广泛。关于数组的操作通常是:查找、插入、删除。二分查找是我们常用的一种查找方式,效率比较高。提到二分查找,最原始的方式是线性查找。线性查找就是直接在有序数组的基础上直接从左向右方向进行查找,当在数组中找到一个比一个待查数据大时就退原创 2016-07-10 21:20:15 · 4348 阅读 · 0 评论 -
Java环境配置及Hello World!程序运行与调试。
Java开发环境配置 Hello World!程序运行与调试原创 2016-06-12 22:56:50 · 5904 阅读 · 0 评论 -
Java语法基本篇:java处理数组
java处理数组原创 2016-06-13 23:15:12 · 2405 阅读 · 0 评论 -
java线程(二):线程同步与同步锁
线程同步、同步锁使用以及常见sleep()、join()、yield()、wait()等使用介绍。原创 2016-06-29 22:38:33 · 1632 阅读 · 0 评论 -
java线程(一):线程创建与线程状态
关于线程,线程是java中非常重要的一部分。很多程序的设计离开不了对线程的设计。多任务本质上就是实现多线程。多线程是实现多任务的一种。说到线程必须要提到进程,进程指的是在内存中运行的应用程序,每个进程都有自己的运行内存空间,一个进程可以启动多个线程。java.lang.Thread类实例中每个线程都有一个调用栈。 java程序总是从main()方法开始执行,main方法存放在一个线程内,成原创 2016-06-29 21:32:09 · 1139 阅读 · 0 评论 -
java枚举
java 枚举特性。原创 2016-06-29 17:12:12 · 533 阅读 · 0 评论 -
java抽象和抽象类
java抽象与抽象类原创 2016-06-29 16:12:40 · 420 阅读 · 0 评论 -
java接口与内部类
java接口与内部类原创 2016-06-29 15:10:41 · 409 阅读 · 0 评论 -
java多态、动态绑定与静态绑定、向上转型、传值引用和传引引用
解释java多态、动态绑定、静态绑定、向上转型、传值引用和传值引用的相关特性。原创 2016-06-29 14:23:59 · 1060 阅读 · 0 评论 -
java继承与覆盖
java继承与覆盖原创 2016-06-28 23:21:57 · 789 阅读 · 0 评论 -
java对象、重载、访问控制符
对象和包、重载和访问控制符原创 2016-06-28 22:19:54 · 797 阅读 · 0 评论 -
java类和对象的思想以及常见类使用实例
java类和对象思想、math、calender、日历类GregorianCalendar的使用实例原创 2016-06-28 21:20:13 · 1624 阅读 · 0 评论 -
java线程(三):线程设计模型—生产者和消费者
使用生产者-消费者-仓库模型对多线程程序进行设计,防止死锁情况发生。原创 2016-06-29 23:26:58 · 1007 阅读 · 0 评论 -
java输入与输出(I/O)(二):常见输入输出流小结
java常见输入输出流总结,包括节点流、过滤流、多字节输入输出流、带缓冲的输入输出流等。原创 2016-06-30 21:38:45 · 2596 阅读 · 0 评论 -
java虚拟机理解(一)——内存模型与对象创建
JVM是java语言一项重要产物,正是由于JVM的存在,才使得java语言的跨平台特性。闲话少说,先来总结一下java虚拟机的内存模型。1) 再说java内存模型 运行时数据区域通常分为:方法区和堆以及虚拟机栈、本地方法栈、程序计数器。以上几个部分构成运行时数据区。先来看看各部分负责的功能。程序计数器:这个比较好懂,就是PC指针。当前线程所执行代码的行号指示器,通过计数器来取下一条需要执行原创 2017-03-21 13:53:24 · 783 阅读 · 0 评论 -
java实现上位机与下位机串口通信
串口通信是在工程应用中很常见。在上位机与下位机通讯过程中常通过有线的串口进行通信,在低速传输模式下串口通信得到广泛使用。在说个之前先来简单解释一下上位机与下位机的概念。上位机与下位机通常上位机指的是PC,下位机指的是单片机或者带微处理器的系统。下位机一般是将模拟信号经过AD采集将模拟量转换为数字量,下位机再经过数字信号处理以后将数字信号通过串口发送到上位机,相反上位机可以给下位机发送一些指令或者信息原创 2016-12-24 23:38:21 · 55619 阅读 · 70 评论