一篇文章总结微积分中的所有重要概念 这篇文章介绍了微积分中所有的重要概念,让大家在宏观上知道微积分这门学科主要在研究什么。这篇文章并没有涉及到这些概念的具体细节,因此大多数人可以很容易地理解它,并掌握微积分中的重点,从而使大家更有针对性地学好微积分这门课程。
算法导论之2.3-7练习题 题目:给出一个Θ(nlgn)时间的算法。判断在集合S中,是否存在两个元素的和为x。算法导论的教师手册解法如下:1.对集合S排序。 2.创建集合T = {z : z = x − y ,y ∈ S}。 3.对集合T排序。 4.去除S和T中的重复元素。 5.按照从小到大顺序或者从大到小顺序合并两个集合 6.对于合并以后的集合而言,当且仅当集合中的相邻位置出现相等元素,则存在,否则
(个人笔记)Just For Fun!!! OS 39页20题 39页27题 40页29题 61页9题 73页 Petersons Algorithm 75页信号量 Mutex互斥量 与 Semaphore信号量区别 Semaphores in operating system 管程Monitors OS操作系统中一些容易混淆的概念!39页20题ELF 可重定位目标文件的 sect...
学好机器学习必会的统计学知识(第二篇) 引言在机器学习应用中,我们不可能离开数据。没有了数据,机器学习算法就像没有了灵魂。更好地理解数据,可以使我们把它更好地应用在机器学习上。在这篇文章中,我会介绍一些在统计学中,理解数据的一些重要概念,从而使大家更准确地操作数据,玩转数据。注意:在这篇文章中会涉及到很多名词和定义,我就直接用英文了,因为这更加容易理解,翻译成汉语以后会让人更加混乱了。Populations and Parameters
numpy.bincount详解 引言我一般不愿意去写关于api怎么用的博客,因为出api的官网已经很详细地介绍了它们api的作用。今天,我的一个同学问到我numpy.bincount这个的用法,当时我有些事情,我和他说你先去百度一下吧,自己先看看,如果实在不行了我忙完给你解释一下。当然了,我同学的英语水平不怎么好,它不会去查看英文文档,因此他只能看百度搜索出来的一些博客,但是,所有的文章基本相同,当然了,我不知道哪个篇文章是源头。
一次毕生难忘的 Java 内存泄漏排查经历 这里写自定义目录标题在一个凄凉的午夜一定是网络的问题一定是 GC 的问题一定是内存泄漏真有这么糟糕吗?还是不行那现在是怎么回事?修复由修复引起的问题再次优化 GC结论人人都会犯错,但一些错误是如此的荒谬,我想不通怎么会有人犯这种错误。更没想到的是,这种事竟发生在了我们身上。当然,这种东西只有事后才能发现真相。接下来,我将讲述一系列最近在我们一个应用上犯过的这种错误。最有意思的是,一开始的迹象揭示...
数据库规范化,数据库范式,和规范化实例 什么是数据库规范化维基百科的定义如下:数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。数据库范式是埃德加·科德设计出来的。在1970年代初,他定义了第一范式(First normal form)、第二范式(Second normal form),和**第三范式(Third normal form)**的概念。数...
机器学习之参数估计 Probability Theory focus on computing the probability of data arising from a parametric model with known parameters. Statistical Inference flips this on its head: we will estimate the probability of p...
大数定律与中心极限定理 Be able to use the central limit theorem to approximate probabilities of averages and sums of independent identically-distributed random variables.
GDB - COMMANDS 引言转载自:GDB - Commands在做 CSAPP 的 Lab 时,找到这个:最常用的 GDB 命令内容GDB offers a big list of commands, however the following commands are the ones used most frequently:b main - Puts a breakpoint at the ...
(个人笔记)英语语法之动词时态 引言我的笔记对动词加上完成元素Present perfect tenseThe time of the action is before now but not specified, and we are often more interested in the result than in the action itself.我主要把握以下5点它的使用场景:An a...
Reliable Data Transfer Protocol 的原理剖析 相信了解网络的人都知道,TCP 是一个 Reliable Data Transfer 的协议,那么在如此复杂的网络环境下,TCP 是如何实现这个功能的?在这篇文章中,我不会把 Reliable Data Transfer 局限在 TCP 上,我会介绍它的原理,以及实现这样的功能我们需要做哪些事情......
深入理解 java 中的 Soft references & Weak references & Phantom reference 这篇文章中主要介绍了java中的Soft references、Weak references 和Phantom reference,通过讲解这些知识点,例举了几个经典的内存泄露问题。如果你正走在成为一名Java高级工程师的路上,那么这篇文章非常适合你。
Java并发系列 - Java Concurrency Utilities 之 Executor 框架 现在大部分的应用都需要并发,并且这些并发应用变得越来越复杂,因此Java最初给我提供的并发手段(比如:`synchronized` `volatile` `wait()` `notify()`)等越来越难以满足我们开发并发应用的需求。如果使用这些原始的并发手段,程序员需要更高的编程能力,增加开发时间,导致我们浪费很多精力在并发应用的正确性上,而不能只专注于我们自己手上的业务。
常用的数据结构操作与排序算法的时间和空间复杂度 大家好!这篇文章包含了计算机科学中常用算法的时间和空间复杂度。过去准备技术面试的时候,我通常需要花费很多时间去网上搜索这些算法的最好、平均和最坏情况的复杂度,然后把它们归纳总结在一起,使得我在面试问到的时候不会被难住。在过去的几年里,我面试了一些硅谷的创业公司,也有一些像Google, Facebook, Yahoo, LinkedIn, 和 eBay这样的大公司,当我每一次准备面试时,我自己就
对 Practical Vim 一书的总结 如果有一个神器让你在编辑文件的过程中不需要用到鼠标(有些人可能会说,我一直用笔记本的触摸板,从没用到过鼠标,哈哈),你会用它吗?但是如果这个神器需要一点学习成本,你会选择使用它吗?我相信这个答案会因人而异,因为每个决定的背后都有一个 trade-off,就像算法一样(在空间与时间之间做出选择),所以找出当下环境下适合自己的决定才是最重要的。
从Vim小白到Vim superstar 引言我的图形界面环境(GUI)编辑器一直是gedit,而命令行环境(CLI)的编辑器一直是Vim. 我一直想写一篇关于如何使用VIM的文章,但是我感觉使用Vim首先就是应该熟练掌握它强大地命令,从而才能高效地使用这个编辑器,所以我感觉写一篇罗列各种命令的文章毫无任何意义,因此就一直拖延到现在。但是,最近看到了老外写的一篇关于Vim的文章,感觉写的太好了。就像他说的那样,一旦你读完了文章,你就可以成为
Java应用缓存介绍与LRU(Least Recently Used)算法 对于大规模的Java Web应用来说,会有大量的数据和大量的用户,对于如何提升网站的响应速度成为了我们开发人员的一个挑战。对于缓存来说,它可以解决其中的一部分问题。在这篇文章中,我会介绍什么是缓存,它的工作流程是什么样的,被缓存的数据应该具有什么样的特性。最后我会介绍一个非常受欢迎的缓存算法 - LRU,并给出了一个具体的实现。
排序算法算法之Bubble Sort 在接下来的一段时间里,我准备整理一下自己的博客。尽自己最大努力把几年前写过的文章都看一遍,把一些存在错误的文章修改一下、把没有必要修改的文章删掉以及把一些知识点不全的文章进行完善。之所以整理自己的博客有以下3点原因
Hotspot虚拟机- 垃圾收集算法和垃圾收集器 当提到Java虚拟机的时候,我们首先应该区分2件事情。一个是抽象的[Java虚拟机规范](https://docs.oracle.com/javase/specs/jvms/se7/html/),另一个是根据这个规范具体的实现。市面上有很多根据这个规范实现的虚拟机,比如jRockit、IBM J9、Hotspot等。那么在这篇文章中,我只介绍关于Hotspot虚拟机的行为,以及它里面提供的垃圾收集器。
Servlet之存在安全隐患的域对象 我一直不愿意删除我几年前写的blog,这并不是因为我先前写的有多么的好,我只是认为它代表着每一阶段自己的技术水平,就像是一段记忆一样,等到过几年再次看到的时候能回忆起当时很多的事情。但是,随着自己技术水平的提高,我会发现自己先前写的文章(甚至有的不能算是文章,仅仅是几个API的功能)有很多错误的地方,而且一篇文章就能写完的东西却分散在几篇文章中。
Logistic Regression、Linear Discriminant Analysis、Shrinkage Methods(Ridge Regression and Lasso) 引言Logistic RegressionDefault数据集描述,详细信息在第6页。数据集下载logistic regression 是一个线性模型用于做分类的,它直接对Y属于某个类别的概率进行建模。比如对于Default数据集来说,Pr(default = Yes | balance, student, income). 这也就是说,对于任何给定的balance, stud
学好机器学习必会的统计学知识(第一篇) 在机器学习应用中,我们不可能离开数据。没有了数据,机器学习算法就像没有了灵魂。更好地理解数据,可以使我们把它更好地应用在机器学习上。在这篇文章中,我会介绍一些在统计学中,理解数据的一些重要概念,从而使大家更准确地操作数据,玩转数据。
Scrapy实战之抓取豆瓣图书 引言为了能更方便地选择自己喜欢的书籍,我自己写了一个Scrapy项目用来抓取豆瓣上的书籍。抓取的内容包括书籍的书名、作者、书信息、1到5星的百分数、评分和评论数。通过获取到的这些数据,我们可以做相应的分析。比如:我们可以抓取某一类书箱,看看哪本书的评论数最多或者评价分数最高。当然了,我指的这个是最简单的处理了。复杂一点的你可以用Python或R来分析相应变量之间的关系,比如:是否评论数越多书的评分越
Understanding the Bias-Variance Tradeoff (理解偏差-方差权衡) 引言如果你想深入地理解偏差-方差,这篇文章再好不过了。我转载自Understanding the Bias-Variance Tradeoff,Trust me,这绝对是你不想错过的文章。如果你的网络不好,就先看我下面转载的。如果你的网络很好,去查看原文,里面有一些非常棒的小功能,我没法转载过来,比如在用K近邻举例的时候,你可以实时微调K值并查看决策边界。Hope you enjoy this ar
R实战之从头到尾分析广告数据集 前言这篇文章主要用简单的线性回归模型来介绍统计学中一些很重要的概念。比如:置信区间(confidence interval)、t-statistic、p-value、R2R^2 statistic和F-statistic等一些概念。我会用具体的数据集来分析这些值分别意味着什么?并用具体的R代码来分析数据集并做出一个好的决策?数据分析之前的几个重要问题在提出问题之前,我先介绍一下Advertising
Bagging(Bootstrap aggregating)、随机森林(random forests)、AdaBoost 在这篇文章中,我会详细地介绍Bagging、随机森林和AdaBoost算法的实现,并比较它们之间的优缺点,并用scikit-learn分别实现了这3种算法来拟合Wine数据集。全篇文章伴随着实例,由浅入深,看过这篇文章以后,相信大家一定对ensemble的这些方法有了很清晰地了解。
决策树ID3、C4.5、C5.0以及CART算法之间的比较-并用scikit-learn决策树拟合Iris数据集 引言在这篇文章中,我主要介绍一下关于信息增益,并比较ID3、C4.5、C5.0以及CART算法之间的不同,并给出一些细节的实现。最后,我用scikit-learn的决策树拟合了Iris数据集,并生成了最后的决策树图片信息增益(information gain (IG))在介绍信息增益之前,我想先介绍3种不纯度的度量手段,它们分别是Gini index(IG)、entropy(IH)、classifi
机器学习系统模型调优实战--所有调优技术都附相应的scikit-learn实现 引言如果你对机器学习算法已经很熟悉了,但是有时候你的模型并没有很好的预测效果或者你想要追求更好地模型性能。那么这篇文章会告诉你一些最实用的技术诊断你的模型出了什么样的问题,并用什么的方法来解决出现的问题,并通过一些有效的方法可以让你的模型具有更好地性能。介绍数据集这个数据集有569个样本,它的前两列为唯一的ID号和诊断结果 (M = malignant, B = benign) ,它的3->32列为
PCA详解-并用scikit-learn实现PCA压缩红酒数据集 在这篇文章中,我会介绍一些PCA背后的数学概念,然后我们用Wine数据集作为实例,一步一步地实现PCA。最后,我们用更加强大的scikit-learn方便快速地实现PCA,并用逻辑回归来拟合用PCA转换后的数据集。为了让大家更好地理解PCA,整篇文章都贯穿着实例,现在,让我们享受这篇文章吧。
SVM详解(包含它的参数C为什么影响着分类器行为)-scikit-learn拟合线性和非线性的SVM 引言这篇文章详细地介绍了SVM背后的原理,它为什么是大间距分类器?分类器的参数C为什么影响着分类器的行为?核函数背后采用了什么样的技术,看过这篇文章以后,相信你能很好地理解这些问题。最后,我用scikit-learn来分别来拟合线性和非线性的SVM,让大家对SVM分类器有更加深刻的理解。找寻最优化目标相信所有用过SVM的人都知道它是一个大间距分类器。但是,它的原理是什么?它为什么可以最大化决策边界与
逻辑回归(Logistic regression)详解-并用scikit-learn训练逻辑回归拟合Iris数据集 引言这篇文章主要介绍逻辑回归背后的一些概率概念,给你一些直观感觉关于它的代价函数的由来。并且我也介绍了关于最大似然估计(maximum likelihood)的概念,用这个强大的工具来导出逻辑回归的cost函数。接着,我用scikit-learn训练了感知机模型来让你熟悉scikit-learn,最后用scikit-learn来训练逻辑回归,并作出决策边界图,效果还算不错。逻辑函数(logistic
机器学习算法之朴素贝叶斯(Naive Bayes)--第二篇 引言如果你对朴素贝叶斯的原理不太清楚,请看我的第一篇文章:http://blog.csdn.net/xlinsist/article/details/51236454这篇文章主要介绍将朴素贝叶斯模型应用到文本分类任务的技巧和方法。词袋模型(The Bag of Words Model)对于机器学习算法来说,特征的选择是一个很重要的过程。那么如何从文本训练集中选出好的特征呢?在自
机器学习算法之朴素贝叶斯(Naive Bayes)--第一篇 引言先前曾经看了一篇文章,一个老外程序员写了一些很牛的Shell脚本,包括晚下班自动给老婆发短信啊,自动冲Coffee啊,自动扫描一个DBA发来的邮件啊, 等等。于是我也想用自己所学来做一点有趣的事情。我的想法如下:首先我写个scrapy脚本来抓取某个网站上的笑话之后写个Shell脚本每天早上6点自动抓取最新的笑话然后用朴素贝叶斯模型来判断当前的笑话是否属于成人笑话如果是成人笑话,用脚本把它
l0-Norm, l1-Norm, l2-Norm, … , l-infinity Norm 引言原文:https://rorasa.wordpress.com/2012/05/13/l0-norm-l1-norm-l2-norm-l-infinity-norm/这篇文章是我按照上面原文的部分翻译,这篇文章不仅仅介绍了这些范数(Norm)的含义,而且还结合了一些具体的应用,给出了一些最优化范数的方法。原文很长,我就把一些有用的定义翻译一下,感兴趣的伙伴可以自己查看原文。什么是范数对于任何一个
浅谈机器学习中的特征缩放(feature scaling) 引言在运用一些机器学习算法的时候不可避免地要对数据进行特征缩放(feature scaling),比如:在随机梯度下降(stochastic gradient descent)算法中,特征缩放有时能提高算法的收敛速度。下面我会主要介绍一些特征缩放的方法。什么是特征缩放特征缩放是用来标准化数据特征的范围。机器算法为什么要特征缩放特征缩放还可以使机器学习算法工作的更好。比如在K近邻算法中,分类器主要是计
启动ipython或python解释器自动导入组件(例如:numpy) 引言在用numpy,pandas等一些科学计算库的时候,每次启动ipython我都会重复的导入这些库,这真是烦死了。后来我查看了python和ipython的官方文档解决了这个问题。现在,我总结一下这几个方法,希望能帮助到别人。python解释器自动导入组件这其实很简单,就一个环境变量就能搞定。用下面命令:PYTHONSTARTUP=~/test/xlinsistexport PYTHONSTAR
Linux 文件描述符详解 Overview了解Linux怎样处理输入和输出是非常重要的。一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置。同样我们也可以更好地理解输入重定向和输出重定向。Linux标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误输出Linux系统将所有设备都当作文件
Ubuntu下图形界面卡死解决办法 Overview我个人比较喜欢Ubuntu系统,可是该死的桌面环境有的时候总卡死。无论怎么按都没用。也不能总是按关机按钮吧。于是,我有了下面的想法。杀死进程ubuntu下的xorg软件包是包括显卡驱动、图形环境库等等一系列软件包,我想我把它的进程杀掉,GUI桌面就应该会好使了吧。于是我用了下面的命令找到Xorg命令的进程pid。ps -t tty7当然了在卡死的情况下,我们不能打开终端。但是,我们用
轻松搞定Linux环境变量 引言我一直以来都在用Ubuntu系统,每当我装一些软件的时候,我都会本能的Google去看怎么配置这些烦人的环境变量。有的时候,还会出现很多的错误。因为我不明白到底在配置什么,我只是本能的Copy到我的一些文件中,它就可以工作了,但是我不明白其原理,所以出错了以后我会花很多时间来重新Google,甚至把先前所有的东西都删掉,因为我也不知道具体哪里出错了。因此,我决定学习一下,把这个东西搞定。环境变量
Ubuntu安装Zeal并安装pandas库文档 Overview工欲善其事,必先利其器。写程序的时候没有官方的API文档是肯定不行的。在网上搜索有可能出于网速的原因而影响自己编程的效率,而且有的时候我想查询某一个对象的某一个方法真是很长时间才能找到。Zeal可以很好的帮你解决这个问题。安装Zeal打开终端,下面三条命令就OK了$ sudo add-apt-repository ppa:zeal-developers/ppa$ sudo apt-
概率密度函数(probability density function)课程笔记 PDFs一个合法的PDF有2个条件:fX(x)≥0f_X(x) \ge 0∫∞−∞fX(x)dx=1\int_{-\infty}^{\infty}f_X(x)dx = 1取值在一个连续的集合上,并且它的概率能通过PDF来描述,这样的随机变量才是连续随机变量。对于连续随机变量X,它在区间[a, b]的概率为:P(a≤X≤b)=∫bafX(x)dxP(a \le X \le b) = \int_{
linux ln 命令详解 软链接首先,我在我的target目录下创建了文件lovedog.txt,并写了一行文字,如下图:接着,我在target的父目录shelltest中创建一个指向lovedog.txt的符号链接,即软链接,并编辑了一下。如下图:当我们去target目录中看lovedog.txt文件时,内容也发生了变化。同样的道理,我可以创建很多个软链接指向lovedog.txt,如下图:同样,当我们修改任何一个软链接文
两篇文章掌握Python语法和内置函数功能(第二篇) Overview这篇文章是接着上篇文章写的,主要介绍Python的字典结构,操作文件,正则表达式。上篇文章链接如下:http://blog.csdn.net/xlinsist/article/details/50866079字典先看看下面的例子:## 构建一个字典dict = {}## 向字典中存入键值对dict['a'] = 'alpha'dict['g'] = 'gamma'dict['
一张图搞定多变量微积分 Overview此篇文章包含多变量微积分一些重点概念和一些重要应用。通过一些已有的结论和公式来解决现实中的问题。通过多变量微积分的学习让我对机器学习的一些算法了解的更加透彻。我并没有阐述公式的原理和其推导过程,但是,我会在相应主题的下面给你一些解释其原理的链接,如果想了解的话可以看看。核心内容我自己画了一张思维导图,我会按照图上的标号依次阐述其具体内容。图片如下:(一) 梯度函数f的梯度表示为∇f\
用等高线图(Contour maps)可视化多变量函数 Overview由于我们用手来画三维图像很困难,我们可以用等高线图来描述图像会更加简单。等高线图用于描述两维输入和一维输出的函数,例如:f(x,y)=x5−x3+y3f(x,y) = x^5 - x^3 + y^3如何画等高线图选择一系列等间隔的输出值,例如:{0.7, 0.4, 0.1, -0.2}对于上面的每个输出值,找到所有的输入值(x,y),使得f(x,y)等于那个输出值。下面的例子可
两篇文章掌握Python语法和内置函数功能(第一篇) OverviewPython是一种动态,解释型语言。它的变量、参数、函数或者一些在源码中的方法都不需要类型声明。你并不需要编译时的类型检查,Python会在运行时确定所有值的类型和标记运行到的有错误的代码。字符串Python字符串像Java一样都是不可变的。当我们写这样一个表达式的时候,例如表达式(‘hello’ + ‘world’),它会新构建一个字符串’hellothere’,而不会在先前的字符
附加理论材料课程笔记 几何PMF的方差容斥定理我们可以用指示器随机变量来推导出上面的公式:通过先前的学习,已经知道对于一个事件A的指示器随机变量的期望为E[IA]=P(A)E[I_A] = P(A)。设事件A = A1∪A2∪A3A_1 \cup A_2 \cup A_3,它的指示器随机变量为IAI_A,则P(A)=E[IA]P(A) = E[I_A]设事件A1A_1的指示器随机变量为X1X_1,则Ac1A_1^c的指示
加条件的随机变量和多个随机变量的独立性课程笔记 Conditional PMFspX|Y(x|y)=P(X=x|Y=y)=P(X=x and Y=y)P(Y=y)=pX,Y(x,y)pY(y)p_{X | Y}(x | y) = P(X = x | Y = y) = \frac{P(X = x\ and\ Y = y)}{P(Y = y)} = \frac{p_{X,Y}(x, y)}{p_Y(y)} 定义的y使得pY(y)>0p_Y(y) \g
方差,条件事件,多个随机变量课程笔记 方差(variance)定义和属性var(X)=E[(X−μ)2]var(X) = E[(X - \mu)^2]根据期望值规则可得:var(X)=∑x(x−μ)2PX(x)var(X) = \sum\limits_x(x - \mu)^2P_X(x)标准差(Standard deviation):σX=var(X)−−−−−−√\sigma_X = \sqrt {var(X)}var(aX+b)=a
Oscar的狗丢失在丛林中(条件与独立性概率习题) 题意如下Oscar has lost his dog in either forest A (with probability 0.4) or in forest B (with probability 0.6).If the dog is in forest A and Oscar spends a day searching for it in forest A, the conditional
条件概率和Bayes法则(Bayes' rule) 条件概率的定义P(A|B)=P(A∩B)P(B)P(A | B) = \frac{P(A \cap B)}{P(B)}条件概率与普通概率相同的属性P(A|B)≥0P(A | B) \ge 0P(Ω|B)=P(Ω∩B)P(B)=P(B)P(B)=1P(\Omega | B) = \frac{P(\Omega \cap B)}{P(B)} = \frac{P(B)}{P(B)} = 1P(B|B)
UML类图几种关系的总结 原文链接:http://blog.csdn.net/tianhai110/article/details/6339565概述在UML类图中,常见的有以下几种关系:泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。泛化(Generalization)【泛
已解决的问题课程笔记 P((A∩Bc)∪(Ac∩B))=P(A)+P(B)−2∗P(A∩B)P((A \cap B^c) \cup (A^c \cap B)) = P(A) + P(B) - 2 * P(A \cap B)推导过程如下因为A∩Bc和Ac∩BA \cap B^c 和 A^c \cap B是不相交的,所以根据可加性公理可得: P((A∩Bc)∪(Ac∩B))=P(A∩Bc)+P(Ac∩B)P((A \cap
数学背景知识课程笔记 集合(Set)集合中不能包含重复的元素。并集和交集x∈S∪T等价于x∈Sx \in S \cup T 等价于 x \in S or x∈Tx\in Tx∈S∩T等价于x∈Sx \in S \cap T 等价于 x \in S and x∈Tx\in T集合属性S∪T=T∪SS \cup T = T \cup S S∩(T∪U)=(S∩T)∪(S∩U)S \cap (T \cup U) = (S \
每个开发者都应试知道的 Git 命令 前言读这篇文章之前要求读者要有一些Git的基础,否则,一些细节有可能看不明白。这里我建议大家先读读这本书的前三章。书的链接如下:https://git-scm.com/book/en/v2Git原理Git与其它的VCS不同的是,客户端不是只查看文件的最新快照,而是拥有仓库的全部镜像。如果一个Server Down了,任何一个客户端都能把项目完整的还原。Git是分布式版本控制系统,那么它是没有中央服务
Java实现二叉搜索树 前言在做算法导论第12章的习题时,有一些习题需要用到二叉搜索树的数据结构,为了方便,我将其用Java实现了这个数据结构。Talk is cheap,show me the code.我就闲话少说了,代码如下。Java代码实现二叉搜索树数据结构package hanxl.insist.twelvechapter;import java.util.Stack;/** * 搜索二叉树 * @autho
(个人笔记)操作系统分类 引言操作系统的发展是随着计算机的硬件技术、应用需求的发展、软件新技术的出现而发展的。其目标是充分利用硬件,为用户提供更好的服务。分时操作系统概述操作系统将CPU的时间划分成若干个片段,称为时间片。操作系统以时间片为单位,轮流为每个终端用户服务,当时间片时间到了,它就会为其他用户服务。目标充分利用CPU资源,实现多用户操作。及时响应从终端用户发出的命令。实时操作系统概述计算机能及时响应外部事件的
算法导论 8-3思考题 之变长数据项的排序 题目 给定一个整数数组,其中不同的整数所包含的数字的位数可能不同,但该数组中,所有整数中包含的总数字为n。设计一个算法,使其可以在O(n)时间内对该数组进行排序。算法思路首先,我们可以用计数排序按数字的位数进行排序。然后,用基数排序来对每组数位相同的数字进行排序。每个数字的数位在1到n之间,令i为数字的位数,mim_i为位数为i的数字的个数。由于一共n位数,So,我们有如下公式:∑i=1ni∗
算法导论 8-2思考题 之线性时间原址排序 题目我就不把题目所有的内容全部写下来了,主要问题如下: n条记录,所有值都在1到k区间内,如何修改计数排序,使得它在O(n + k)的时间内完成对n条记录的原址排序。除输入数组外,你可以使用O(k)大小的额外存储空间。算法思想通过稍微修改一下计数排序,可以求得每个元素的开始下标。然后选择数组中的第一个元素和它正确位置上的元素交换,重复这一步,直到第一个元素就位。接着选择数组中的第二个元素重复这
程序员应知道这十大面向对象设计原则 引言我经常看到不同经验水平的java程序员,他们有的不知道这些 OOPS 和SOLID设计原则,有的只是不知道一个特定的设计原则会带来怎样的益处,甚至不知道在编码中如何使用这些设计原则。面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) 、 Decorator(装饰器)、Observer(观察者) 等设计模式, 而没有把足够多的注意力放在学习面
排序算法汇总 引言排序是算法研究中最基础的问题,如何快速得完成所给元素的排序是很重要的。下面我将归纳出一些常用的排序算法,并将其分别用Java语言实现。归纳表格如下 排序算法 最坏情况运行时间 期望运行时间 辅助存储空间 稳定性 插入排序 Θ(n^2) Θ(n^2) O(1) 稳定 归并排序 Θ(nlogn) Θ(nlogn) O(n) 稳定 堆排序
堆排序算法之Java实现 堆排序的基本思想是:利用数组的特点快速定位指定索引的元素,并将其构造成一个大顶堆,它可以被看作是一个完全二叉树。大顶堆的要求是每个节点的值都不大于其父节点的值。Java代码实现此算法如下:package hanxl.insist.seven;import java.util.Arrays;/** * 堆排序 * @author 韩兴隆 */public class HeapSort {
桶排序算法之Java实现 桶排序算法原理:将数组分到有限数量的桶子里。在将每个桶子里面的数据进行排序。Java代码实现此算法如下:public class BucketSort { public static void main(String[] args) { //随机产生10个介于0-1之间的保留2位小数点的小数 float[] a = new float[10];
快速排序(Quicksort)详解 引言这篇文章是我在2015年写的,当时正在看算法导论中关于快排的部分,因此写下文章总结一下当时对快排的理解。这几天我一直在review一下我先前写的blog,发现有些地方写的不算太好,还有一些错误的地方。今天我重新修改一下这篇文章,把错误的地方修正过来,并补充一些新的内容。初识QuicksortQuicksort是一个分而治之的算法,它根据主元把一个大数组分成2个小数组:其中1个数
基数排序算法之Java实现 基数排序的原理:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。Java代码实现此算法如下:/** * 基数排序 * * @param a * 待排序的数组 * @param d *
计数排序算法之Java实现 计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。Java代码实现此算法如下:/**
归并排序算法之Java实现 归并排序的基本思想完全遵循分治模式:分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。解决:使用归并排序递归的排序两个子序列。合并:合并两个已排序的子序列以产生已排序的答案。Java代码实现此算法如下:public static void mergeSort(int[] arr, int lo, int hi) { if ( lo < hi - 1 ) {
排序算法算法之Insertion Sort 插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。Java代码实现此算法如下:public static void insertionSort(int[] a) { for (int i = 1; i < a.length; i++) { int key = a[i];
Java实现Strassen Strassen算法也是一种基于分治思想的算法。首先我们用普通的分治方法来实现矩阵的乘法。这里我是用行下标和列下标来拆分矩阵的,并没有去复制矩阵中的元素,和算法导论中给出的思路是一样的。注意:以下的程序只适用N*N的矩阵。首先,我定义一个关于矩阵的对象,Java代码如下:package hanxl.insist.beans;/** * 矩阵类 * 之所以设置起始和结束下标是
leetcode之Maximum Subarray 题目如下图所示:链接地址:https://leetcode.com/problems/maximum-subarray/暴力方法如下:public static MaximumSubarrayInfo violence_maximumSubarray( int[] arr ) { MaximumSubarrayInfo maximumSubarrayInfo
算法导论之2-4思考题 题目:设A[1..n]是一个包含n个不同数的数组。如果在i < j 的情况下,有 A[i]>A[j],则(i,j)就称为A中的一个逆序对(inversion)。c.插入排序的运行时间与各个元素的逆序对总和相等。d.给出一个算法,它能用Θ(nlgn)的最坏情况运行时间,确定 n 个元素的任何排列中逆序对的数目。为了验证程序的正确性,我顺便写了一个暴力求解的算法,Java代码如下:/** *
以操作系统的角度述说线程与进程 什么是线程什么是线程?线程与进程与有什么关系?这是一个非常抽象的问题,也是一个特别广的话题,涉及到非常多的知识。我不能确保能把它讲的话,也不能确保讲的内容全部都正确。即使这样,我也希望尽可能地把他讲通俗一点,讲的明白一点,因为这是个一直困扰我很久的,扑朔迷离的知识领域,希望通过我的理解揭开它一层一层神秘的面纱。任务调度线程是什么?要理解这个概念,须要先了解一下操作系统的一些相关概...
算法导论之2-3思考题 题目:霍纳规则的正确性: 写出伪代码以实现朴素多项式求值(native polynomial-evaluation)算法,它从头开 始计算多项式的每一个项。这个算法的运行时间是多少?与霍纳规则相比其性能如何?我用Java代码将其实现如下:首先,写出一个计算次方值的方法/** * 计算次方值 * @param a 底数 * @param b 指数
Java代码实现有序向量的二分查找 用这种算法的耗时将大大优于顺序查找,其所需要的时间复杂度为O(logn)代码的第一个版本如下:/** * @param e * 想要查找的元素 * @param arr * 目标数组 * @param lo * 起始元素的下标 * @param hi *
Java GC 日志详解 Java GC日志可以通过 +PrintGCDetails开启,以ParallelGC为例。YoungGC日志解释如下:FullGC日志解释如下:一目了然,一图胜千言。原文链接:http://blog.csdn.net/alivetime/article/details/6895537
深复制,浅复制和 Java Clone 方法 对于C语言,简单的来说就是,在有指针的情况下,浅复制只是增加了一个指针指向已经存在的内存,而深复制就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。由于浅复制是多个指针指向同一块内存,在释放内存的时候不小心会出现重复释放同一块内存的错误,而采用深复制则不会出现这种情况。对于Java语言,简单的来说就是,浅复制是指复制对象时仅仅复制对象本身,而不复制对象中包含的引用类型指向的对象
Google高级搜索技巧 概述作为一名软件工程师更好的利用搜索引擎可以加快我们搜索资料的速度,提高我们的开发效率。所以,学会一些搜索技巧是非常必要的。搜索结果要求包含两个及两个以上关键字一般搜索引擎需要在多个关键字之间加上“+”,而GOOGLE无需用明文的“+”来表示逻辑“与”操作,只要空格就可以了。例如:xlinsist blog搜索结果要求不包含某些特定信息GOOGLE用减号“-”表示逻辑“非”操作。例如:xlinsis
Java集合数据结构 集合类型Set集合:集合元素是不能重复的。元素是没有顺序的。所以它不能基于位置访问元素。TreeSet和HashSet是它的实现类。List集合: 集合元素是可以重复的。元素是有顺序的。所以它可以基于位置访问元素。ArrayList和LinkedList是它的实现类。Map:它包含键值对。Map的键是不能重复的。Map不能保证存储的顺序。HashMap和TreeMap是它的实现类。
Java虚拟机垃圾收集器 垃圾收集器用到的垃圾收集算法标记-清除(Mark-Sweep)算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它主要有两个缺点:一个是效率问题,标记和清楚过程的效率都不高;另外一个是空间问题,标记清楚后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够连续的内存空间而不得不提前出发另一次垃圾收集动作。执行过程如下图所示
深入探讨Java 类加载器 什么是类加载器?类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个
详解Java虚拟机类加载 概述在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的。虚拟机把描述类的数据从Class文件或其它地方加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载过程。类加载的时机加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶
Java内存区域与模拟内存区域异常 我把Java的内存区域画了一张思维导图,以及各区域的主要功能。模拟Java堆溢出Java堆用于存储对象实例,只要不断地创建对象并且保证GC ROOTS到对象之间有可达路径避免被回收机制清除,就可以模拟出Java堆溢出。package hxl.insist.jvm;import java.util.ArrayList;import java.util.List;/*