﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xiaomage234-随笔分类-algorithm</title><link>http://www.blogjava.net/xiaomage234/category/54732.html</link><description>生命本就是一次凄美的漂流，记忆中放不下的，永远是孩提时代的那一份浪漫与纯真！</description><language>zh-cn</language><lastBuildDate>Fri, 23 Jun 2017 08:11:00 GMT</lastBuildDate><pubDate>Fri, 23 Jun 2017 08:11:00 GMT</pubDate><ttl>60</ttl><item><title>白话经典算法（转）</title><link>http://www.blogjava.net/xiaomage234/archive/2017/06/23/432621.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 23 Jun 2017 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2017/06/23/432621.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/432621.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2017/06/23/432621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/432621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/432621.html</trackback:ping><description><![CDATA[<div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">from:http://blog.csdn.net/MoreWindows/article/category/859207&nbsp;<br /><h1><a href="http://blog.csdn.net/morewindows/article/details/12684497" style="color: #000000; text-decoration: none;">【白话经典算法系列之十七】 数组中只出现一次的数</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">数组A中，除了某一个数字x之外，其他数字都出现了三次，而x出现了一次。请给出最快的方法找到x。 这个题目非常有意思，在本人博客中有《位操作基础篇之位操作全面总结》这篇文章介绍了使用位操作的异或来解决&#8212;&#8212;数组中其他数字出现二次，而x出现一次，找出x。有《【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)》这边文章介绍了分组异或的方法来解决&#8212;&#8212;数组中其他数字出现二次，而x和y出现一次，找出x和y。而这个题目则是其他数字出现3次，x出现一次。...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2013-10-21 11:49</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/12684497" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(32100)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/12684497#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(34)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/12683723" style="color: #000000; text-decoration: none;">【白话经典算法系列之十六】&#8220;基数排序&#8221;之数组中缺失的数字</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">首先看看题目要求： 给定一个无序的整数数组，怎么找到第一个大于0，并且不在此数组的整数。比如[1,2,0]返回3，[3,4,-1,1]返回2，[1, 5, 3, 4, 2]返回6，[100, 3, 2, 1, 6,8, 5]返回4。要求使用O(1)空间和O(n)时间。 这道题目初看没有太好的思路，但是借鉴下《白话经典算法系列之十一道有趣的GOOGLE面试题》这篇文章，我们不发现使用&#8220;基数排序&#8221;正好可以用来解决这道题目...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2013-10-15 10:17</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/12683723" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(13580)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/12683723#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(11)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/10645269" style="color: #000000; text-decoration: none;">【白话经典算法系列之十五】&#8220;一步千里&#8221;之数组找数</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">【白话经典算法系列之十五】&#8220;一步千里&#8221;之数组找数 有这样一个数组A，大小为n，相邻元素差的绝对值都是1。如：A={4,5,6,5,6,7,8,9,10,9}。现在，给定A和目标整数t，请找到t在A中的位置。除了依次遍历，还有更好的方法么？...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2013-09-02 12:57</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/10645269" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(25918)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/10645269#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(39)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/8439393" style="color: #000000; text-decoration: none;">【白话经典算法系列之十三】随机生成和为S的N个正整数&#8212;&#8212;投影法</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">【白话经典算法系列之十三】随机生成和为S的N个正整数&#8212;&#8212;投影法&nbsp; &nbsp;&nbsp;&nbsp; 随机生成和为S的N个正整数有很多种解法。下面讲解一种比较高效且比较有趣味性的解法&#8212;&#8212;投影法。&nbsp;&nbsp;&nbsp; 以生成和为20的4个数为例，可以先生成随机生成0到20之间的三个数字再排序，假设得到了4，7，18。然后在X-Y数轴上画出这三个数，如下图：然后将这些数值投影到Y轴上，可得下图：由图很容易看出AB，BC，CD，DE这四段的长度...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2013-01-04 13:46</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8439393" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(15710)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8439393#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(46)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/8214003" style="color: #000000; text-decoration: none;">【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">微博http://weibo.com/MoreWindows已开通，欢迎关注。本系列文章地址：http://blog.csdn.net/MoreWindows/article/category/859207首先来看题目要求：在一个数组中除两个数字只出现1次外，其它数字都出现了2次， 要求尽快找出这两个数字。&nbsp;&nbsp;&nbsp; 考虑下这个题目的简化版&#8212;&#8212;数组中除一个数字只出现1次外，其它数字都成对出现，要求尽快...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2012-11-27 09:17</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8214003" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(35498)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8214003#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(51)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/8212446" style="color: #000000; text-decoration: none;">【白话经典算法系列之十一】一道有趣的GOOGLE面试题 --【解法2】</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">微博http://weibo.com/MoreWindows已开通，欢迎关注。本系列文章地址：http://blog.csdn.net/MoreWindows/article/category/859207&nbsp;上一篇《白话经典算法系列之十一道有趣的GOOGLE面试题》中对一道有趣的GOOGLE面试题进行了详细的讲解，使用了类似于基数排序的做法在O(N)的时间复杂度和O(1)的空间复杂度完成了题目的要...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2012-11-23 07:57</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8212446" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(24806)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8212446#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(52)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/8204460" style="color: #000000; text-decoration: none;">白话经典算法系列之十 一道有趣的GOOGLE面试题</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">微博http://weibo.com/MoreWindows已开通，欢迎关注。最近在微博上看到一道有趣的GOOGLE面试题，见下图：文字版：一个大小为n的数组，里面的数都属于范围[0, n-1]，有不确定的重复元素，找到至少一个重复元素，要求O(1)空间和O(n)时间。&nbsp;&nbsp;&nbsp;&nbsp; 这个题目要求用O(n)的时间复杂度，这意味着只能遍历数组一次。同时还要寻找重复元素，很容易想到建立哈希表来完成，遍历数组...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2012-11-21 09:03</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8204460" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(47907)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8204460#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(87)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/8029996" style="color: #000000; text-decoration: none;">白话经典算法系列之九 从归并排序到数列的逆序数对（微软笔试题）</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">首先来看看原题&nbsp;微软2010年笔试题在一个排列中，如果一对数的前后位置与大小顺序相反，即前面的数大于后面的数，那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2，4，3，1}中，2和1，4和3，4和1，3和1是逆序数对，因此整个数组的逆序数对个数为4，现在给定一数组，要求统计出该数组的逆序数对个数。&nbsp;计算数列的逆序数对个数最简单的方便就最从前向后依次统计每个数字与它后面...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2012-10-15 09:15</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8029996" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(30367)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/8029996#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(36)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/7961256" style="color: #000000; text-decoration: none;">白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">在我的博客对冒泡排序，直接插入排序，直接选择排序，希尔排序，归并排序，快速排序和堆排序这七种常用的排序方法进行了详细的讲解，并做成了电子书以供大家下载。下载地址为：http://download.csdn.net/detail/morewindows/4443208。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有网友提议到这本《MoreWindows白话经典算法之七大排序》电子书讲解细致用来平时学习是非常好的，但是页数有22页...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2012-09-10 10:08</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/7961256" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(42997)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/7961256#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(26)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/6709644" style="color: #000000; text-decoration: none;">白话经典算法系列之七 堆与堆排序</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">堆排序与快速排序，归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前，先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性：1．父结点的键值总是大于或等于（小于或等于）任何一个子节点的键值。2．每个结点的左子树和右子树都是一个二叉堆（都是最大堆或最小堆）。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2011-08-22 20:04</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6709644" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(338481)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6709644#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(188)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/6684558" style="color: #000000; text-decoration: none;">白话经典算法系列之六 快速排序 快速搞定</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高，因此经常被采用，再加上快速排序思想----分治法也确实实用，因此很多软件公司的笔试面试，包括像腾讯，微软等知名IT公司都喜欢考这个，还有大大小的程序方面的考试如软考，考研中也常常出现快速排序的身影。总的说来，要直接默写出快速排序还是有一定难度的，因为本人就自己的理解对快速排序作了下白话解释，希望对大家理解有帮助，达到快速排序，快...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2011-08-13 17:19</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6684558" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(418202)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6684558#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(284)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/6678165" style="color: #000000; text-decoration: none;">白话经典算法系列之五 归并排序的实现</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法（Divide and Conquer）的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单，只要从比较二个数列的第一个数，谁小就先取谁，取了后就在对应数列中删除这个数。然后再进行比较，如果有数列为空，那直接将另一个数列的数据依次取出即可。//将有序数组a[]和b[]合并到c[]中 void MemeryArra...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2011-08-11 11:01</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6678165" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(275147)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6678165#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(154)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/6671824" style="color: #000000; text-decoration: none;">白话经典算法系列之四 直接选择排序及交换二个数据的正确实现</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">直接选择排序和直接插入排序类似，都将数据分为有序区和无序区，所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区，而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。 &nbsp; 设数组为a[0&#8230;n-1]。 1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 初始时，数组全为无...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2011-08-09 11:15</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6671824" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(29055)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6671824#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(38)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/6668714" style="color: #000000; text-decoration: none;">白话经典算法系列之三 希尔排序的实现</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">希尔排序的实质就是分组插入排序，该方法又称缩小增量排序，因DL．Shell于1959年提出而得名。 &nbsp; 该方法的基本思想是：先将整个待排元素序列分割成若干个子序列（由相隔某个&#8220;增量&#8221;的元素组成的）分别进行直接插入排序，然后依次缩减增量再进行排序，待整个序列中的元素基本有序（增...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2011-08-08 11:41</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6668714" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(148913)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6668714#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(82)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/6665714" style="color: #000000; text-decoration: none;">白话经典算法系列之二 直接插入排序的三种实现</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">直接插入排序(Insertion Sort)的基本思想是：每次将一个待排序的记录，按其关键字大小插入到前面已经排好序的子序列中的适当位置，直到全部记录插入完成为止。 &nbsp; 设数组为a[0&#8230;n-1]。 1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 初始时，a[0]自成1个有序区，无序区为a[1..n-1]。...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2011-08-06 19:27</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6665714" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(118661)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6665714#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(81)</span></div><div></div></div><div article_item"="" style="clear: both; background: url(&quot;../images/line_1.gif&quot;) center bottom repeat-x #ffffff; color: #333333; font-family: Arial, Console, Verdana, &quot;Courier New&quot;; font-size: 12px;"><div style="margin: 5px 0px; color: #000000; font-stretch: normal; font-size: 20px; line-height: 30px; font-family: &quot;Microsoft YaHei&quot;;">&nbsp;<h1><a href="http://blog.csdn.net/morewindows/article/details/6657829" style="color: #000000; text-decoration: none;">白话经典算法系列之一 冒泡排序的三种实现</a></h1></div><div style="text-indent: 2em; color: #666666; font-stretch: normal; font-size: 14px; line-height: 24px; font-family: Arial;">冒泡排序是非常容易理解和实现，，以从小到大排序举例： 设数组长度为N。 1．比较相邻的前后二个数据，如果前面数据大于后面的数据，就将二个数据交换。 2．这样对数组的第0个数据到N-1个数据进行一次遍历后，最大的一个数据就&#8220;沉&#8221;到数组第N-1个位置。 3．N=N-1，如果N...</div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-stretch: normal; line-height: 24px; font-family: Arial;"><span style="margin: 0px 5px 0px 0px;">2011-08-06 19:20</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_view.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6657829" title="阅读次数" style="color: #336699; text-decoration: none;">阅读</a>(166505)</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background: url(&quot;../../../images/ico_comm.png&quot;) left center no-repeat;"><a href="http://blog.csdn.net/morewindows/article/details/6657829#comments" title="评论次数" style="color: #336699; text-decoration: none;">评论</a>(94)</span></div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/432621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2017-06-23 11:17 <a href="http://www.blogjava.net/xiaomage234/archive/2017/06/23/432621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深度学习培训班路线</title><link>http://www.blogjava.net/xiaomage234/archive/2017/05/17/432534.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 17 May 2017 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2017/05/17/432534.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/432534.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2017/05/17/432534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/432534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/432534.html</trackback:ping><description><![CDATA[from:http://blog.csdn.net/hemeinvyiqiluoben/article/details/62439861<br /><br /><table style="background-color: #ffffff; color: #606060; font-family: &quot;microsoft yahei&quot;; font-size: 15px; line-height: 22.5px; width: 669px;"><tbody><tr><td rowspan="2"><strong>课程安排<br />第一天&nbsp;<br />上午</strong></td><td><strong>一、机器学习基础</strong></td><td>1.线性代数<br />(1).矩阵运算&nbsp; (2).向量运算<br />(3).SVD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4).PCA<br />2.概率信息论<br />(1).概率分布&nbsp; (2).期望、方差、协方差<br />(3). 贝叶斯&nbsp;&nbsp; (4).结构概率模型<br />3.数值优化</td></tr><tr><td><strong>二、深度学习基础</strong></td><td>1.深度学习介绍&nbsp;<br />(1).发展历史&nbsp; (2).主要应用<br />2.感知器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />3.人工神经网络<br />4.前馈神经网络&nbsp;&nbsp;<br />5.BP算法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />6.Hessian矩阵</td></tr><tr><td><strong>第一天<br />&nbsp; 下午</strong></td><td><strong>三、深度学习进阶---卷积神经网络</strong></td><td>1.CNN卷积神经网络<br />(1).卷积层（一维卷积、二维卷积）<br />(2).池化层（均值池化、最大池化）<br />(3). 全连接层<br />(4).激活函数层<br />(5).Softmax层<br />2.CNN卷积神经网络改进<br />(1).R-CNN （SPPNET）<br />(2).Fast-R-CNN<br />(3).Faster-R-CNN （YOLO、SSD）<br />3.深度学习的模型训练技巧<br />4.梯度下降的优化方法详解</td></tr><tr><td><strong>第二天<br />上午</strong></td><td><strong>四、深度学习软件</strong></td><td>1.深度学习相关软件的安装配置与使用介绍<br />(1).Caffe<br />(2).Tensorflow<br />(3).Torch<br />(4).MXNet</td></tr><tr><td><strong>第二天<br />下午</strong></td><td><strong>五、 CNN应用案例</strong></td><td>(1).CNN与手写数字集分类<br />(2).YOLO实现目标检测<br />(3).PixelNet原理与实现<br />(4).利用卷积神经网络做图像风格结合</td></tr><tr><td><strong>第三天<br />上午</strong></td><td><strong>六、深度学习&#8212;&#8212;循环神经网络</strong></td><td>1.RNN循环神经网络<br />(1).梯度计算<br />(2).BPTT<br />2.RNN循环神经网络改进<br />(1).LSTM<br />(2).GRU<br />(3).Bi-RNN<br />(4).Attention based RNN<br />3.RNN实际应用<br />(1).Seq2Seq的原理与实现 &nbsp;&nbsp;</td></tr><tr><td><strong>第三天<br />下午</strong></td><td><strong>七<span style="color: #000000;">、强化学习</span></strong></td><td>1.强化学习的理论知识<br />2.经典模型DQN讲解<br />3.AlphaGo原理讲解<br />4.RL实际应用<br />(1).实现一个AlphaGo &nbsp;&nbsp;&nbsp;&nbsp;</td></tr><tr><td><strong>第四天<br />上午</strong></td><td><strong>八、对抗性生成网络</strong></td><td>1.GAN的理论知识<br />2.GAN经典模型<br />(1).GAN，CGAN，LAPGAN，DCGAN，<br />3.<span style="font-size: 13px; line-height: 1.6;">GAN经典模型</span><br />(1). INFOGAN，WGAN，S2-GAN<br />4.<span style="font-size: 13px; line-height: 1.6;">GAN实际应用</span><br />(1).DCGAN提高模糊图片分辨率<br />5.GAN实际应用<br />(1).InfoGAN做特定的样本生成</td></tr><tr><td><strong>第四天<br />下午</strong></td><td><strong>九、迁移学习</strong></td><td>1.迁移学习的理论概述<br />2.迁移学习的常见方法<br />(1).基于特征的迁移<br />(2).基于实例的迁移<br />(3).基于数据的迁移<br />(4).深度迁移学习<br />(5).强化迁移学习<br />(6).迁移学习的研究案例<br />(7).迁移学习的应用<br />(8).2017年AAAI最佳论文讲解：利用物理定理的知识迁移到视频理解</td></tr></tbody></table><img src ="http://www.blogjava.net/xiaomage234/aggbug/432534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2017-05-17 11:28 <a href="http://www.blogjava.net/xiaomage234/archive/2017/05/17/432534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TimSort in Java 7</title><link>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423060.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 26 Feb 2015 10:46:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423060.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/423060.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/423060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/423060.html</trackback:ping><description><![CDATA[<article post="" type-post="" status-publish="" format-standard="" hentry="" category-programming="" tag-java="" tag-java7=""  tag-timsort"="" style="font-family: STHeiti; font-size: medium; line-height: normal;"><h1>from：<span style="font-size: medium;">http://www.lifebackup.cn/timsort-java7.html</span></h1><small>2012年09月25日 21:57:48</small><p><strong>1. 为什么写这篇文章</strong></p><p>这篇文章的根源是在产品中发现了一个诡异的bug：只能在产品环境下重现，在我的本地开发环境无法重现，而双方的代码没有任何区别。最后用remote debug的方法找到异常所在：</p><blockquote><p>Exception in thread "main" java.lang.IllegalArgumentException: Comparison&nbsp;<br />method violates its general contract!</p></blockquote><p>Google了这个错误，是由于Java 7内置的新排序算法导致的。这才猛然想起产品的编译环境最近升级到了Java 7。</p><p><strong>2. 结论</strong></p><p>在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort，而在Java 7中，内部实现换成了<a href="http://en.wikipedia.org/wiki/Timsort">TimSort</a>，其对对象间比较的实现要求更加严格：</p><p>Comparator的实现必须保证以下几点（出自<a href="http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare%28T,%20T%29">这儿</a>）：</p><blockquote><p>a). sgn(compare(x, y)) == -sgn(compare(y, x))&nbsp;<br />b). (compare(x, y)&gt;0) &amp;&amp; (compare(y, z)&gt;0) 意味着 compare(x, z)&gt;0&nbsp;<br />c). compare(x, y)==0 意味着对于任意的z：sgn(compare(x, z))==sgn(compare(y, z)) 均成立</p></blockquote><p>而我们的代码中，某个compare()实现片段是这样的：</p><blockquote><p>public int compare(ComparatorTest o1, ComparatorTest o2) {&nbsp;<br />&nbsp;&nbsp;&nbsp; return o1.getValue() &gt; o2.getValue() ? 1 : -1;&nbsp;<br />}</p></blockquote><p>这就违背了a)原则：假设X的value为1，Y的value也为1；那么compare(X, Y) &#8800; &#8211;compare(Y, X)&nbsp;<br />PS: TimSort不仅内置在各种JDK 7的版本，也存在于Android SDK中（尽管其并没有使用JDK 7）。</p><p><strong>3. 解决方案</strong></p><p>3.1) 更改内部实现：例如对于上个例子，就需要更改为</p><blockquote><p>public int compare(ComparatorTest o1, ComparatorTest o2) {&nbsp;<br />&nbsp;&nbsp;&nbsp; return o1.getValue() == o2.getValue() ? 0 :&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (o1.getValue() &gt; o2.getValue() ? 1 : -1);&nbsp;<br />}</p></blockquote><p>3.2) Java 7预留了一个接口以便于用户继续使用Java 6的排序算法：在启动参数中（例如eclipse.ini）添加-Djava.util.Arrays.useLegacyMergeSort=true</p><p>3.3) 将这个IllegalArgumentException手动捕获住（不推荐）</p><p><strong>4. TimSort在Java 7中的实现</strong></p><p>那么为什么Java 7会将TimSort作为排序的默认实现，甚至在某种程度上牺牲它的兼容性（在stackoverflow上有大量的问题是关于这个新异常的）呢？接下来我们不妨来看一看它的实现。</p><p>首先建议大家先读一下<a href="http://en.wikipedia.org/wiki/Timsort">这篇</a>文章以简要理解TimSort的思想。</p><p>4.1) 如果传入的Comparator为空，则使用ComparableTimSort的sort实现。</p><p>&nbsp;<img title="image" border="0" alt="image" src="http://www.lifebackup.cn/wp-content/uploads/2012/09/image.png" width="199" height="63" style="border-width: 0px; display: inline;" /></p><p>4.2) 传入的待排序数组若小于MIN_MERGE（Java实现中为32，Python实现中为64），则</p><blockquote><p>a) 从数组开始处找到一组连接升序或严格降序（找到后翻转）的数&nbsp;<br />b)&nbsp;<a href="http://www.geneffects.com/briarskin/theory/binary/index.html">Binary Sort</a>：使用二分查找的方法将后续的数插入之前的已排序数组</p></blockquote><p><img title="image" border="0" alt="image" src="http://www.lifebackup.cn/wp-content/uploads/2012/09/image1.png" width="426" height="95" style="border-width: 0px; display: inline;" /></p><p>4.3) 开始真正的TimSort过程：</p><p>4.3.1) 选取minRun大小，之后待排序数组将被分成以minRun大小为区块的一块块子数组</p><blockquote><p>a) 如果数组大小为2的N次幂，则返回16（MIN_MERGE / 2）&nbsp;<br />b) 其他情况下，逐位向右位移（即除以2），直到找到介于16和32间的一个数</p></blockquote><p><img title="image" border="0" alt="image" src="http://www.lifebackup.cn/wp-content/uploads/2012/09/image2.png" width="442" height="138" style="border-width: 0px; display: inline;" /></p><p>4.3.2) 类似于4.2.a找到初始的一组升序数列&nbsp;<br />4.3.3) 若这组区块大小小于minRun，则将后续的数补足（采用binary sort插入这个数组）&nbsp;<br />4.3.4) 为后续merge各区块作准备：记录当前已排序的各区块的大小&nbsp;<br />4.3.5) 对当前的各区块进行merge，merge会满足以下原则（假设X，Y，Z为相邻的三个区块）：</p><blockquote><p>a) 只对相邻的区块merge&nbsp;<br />b) 若当前区块数仅为2，If X&lt;=Y，将X和Y merge&nbsp;<br />b) 若当前区块数&gt;=3，If X&lt;=Y+Z，将X和Y merge，直到同时满足X&gt;Y+Z和Y&gt;Z</p></blockquote><p><img title="image" border="0" alt="image" src="http://www.lifebackup.cn/wp-content/uploads/2012/09/image3.png" width="448" height="290" style="border-width: 0px; display: inline;" /></p><p>4.3.6) 重复4.3.2 ~ 4.3.5，直到将待排序数组排序完&nbsp;<br />4.3.7) Final Merge：如果此时还有区块未merge，则合并它们</p><p><img title="image" border="0" alt="image" src="http://www.lifebackup.cn/wp-content/uploads/2012/09/image4.png" width="317" height="64" style="border-width: 0px; display: inline;" /></p><p><strong>5. Demo</strong></p><p>这一节用一个具体的例子来演示整个算法的演进过程：</p><p><strong>*注意*</strong>：为了演示方便，我将TimSort中的minRun直接设置为2，否则我不能用很小的数组演示。。。同时把MIN_MERGE也改成2（默认为32），这样避免直接进入binary sort。</p><blockquote><p>初始数组为[7,5,1,2,6,8,10,12,4,3,9,11,13,15,16,14]&nbsp;<br />=&gt;&nbsp;寻找连续的降序或升序序列 (4.3.2)&nbsp;<br />[1,5,7]&nbsp;[2,6,8,10,12,4,3,9,11,13,15,16,14]&nbsp;<br />=&gt;&nbsp;入栈 (4.3.4)&nbsp;<br />当前的栈区块为[3]&nbsp;<br />=&gt;&nbsp;进入merge循环 (4.3.5)&nbsp;<br />do not merge因为栈大小仅为1&nbsp;<br />=&gt;&nbsp;寻找连续的降序或升序序列 (4.3.2)&nbsp;<br />[1,5,7] [2,6,8,10,12]&nbsp;[4,3,9,11,13,15,16,14]&nbsp;<br />=&gt;&nbsp;入栈 (4.3.4)&nbsp;<br />当前的栈区块为[3, 5]&nbsp;<br />=&gt;&nbsp;进入merge循环 (4.3.5)&nbsp;<br />merge因为runLen[0]&lt;=runLen[1]&nbsp;<br />1) gallopRight：寻找run1的第一个元素应当插入run0中哪个位置（&#8221;2&#8221;应当插入&#8221;1&#8221;之后），然后就可以忽略之前run0的元素（都比run1的第一个元素小）&nbsp;<br />2) gallopLeft：寻找run0的最后一个元素应当插入run1中哪个位置（&#8221;7&#8221;应当插入&#8221;8&#8221;之前），然后就可以忽略之后run1的元素（都比run0的最后一个元素大）&nbsp;<br />这样需要排序的元素就仅剩下[5,7] [2,6]，然后进行mergeLow&nbsp;<br />完成之后的结果：&nbsp;<br />[1,2,5,6,7,8,10,12]&nbsp;[4,3,9,11,13,15,16,14]&nbsp;<br />=&gt;&nbsp;入栈 (4.3.4)&nbsp;<br />当前的栈区块为[8]&nbsp;<br />退出当前merge循环因为栈中的区块仅为1&nbsp;<br />=&gt;&nbsp;寻找连续的降序或升序序列 (4.3.2)&nbsp;<br />[1,2,5,6,7,8,10,12] [3,4]&nbsp;[9,11,13,15,16,14]&nbsp;<br />=&gt;&nbsp;入栈 (4.3.4)&nbsp;<br />当前的栈区块大小为[8,2]&nbsp;<br />=&gt;&nbsp;进入merge循环 (4.3.5)&nbsp;<br />do not merge因为runLen[0]&gt;runLen[1]&nbsp;<br />=&gt;&nbsp;寻找连续的降序或升序序列 (4.3.2)&nbsp;<br />[1,2,5,6,7,8,10,12] [3,4] [9,11,13,15,16]&nbsp;[14]&nbsp;<br />=&gt;&nbsp;入栈 (4.3.4)&nbsp;<br />当前的栈区块为[8,2,5]&nbsp;<br />=&gt;&nbsp;<br />do not merege run1与run2因为不满足runLen[0]&lt;=runLen[1]+runLen[2]&nbsp;<br />merge run2与run3因为runLen[1]&lt;=runLen[2]&nbsp;<br />1) gallopRight：发现run1和run2就已经排好序&nbsp;<br />完成之后的结果：&nbsp;<br />[1,2,5,6,7,8,10,12] [3,4,9,11,13,15,16]&nbsp;[14]&nbsp;<br />=&gt;&nbsp;入栈 (4.3.4)&nbsp;<br />当前入栈的区块大小为[8,7]&nbsp;<br />退出merge循环因为runLen[0]&gt;runLen[1]&nbsp;<br />=&gt;&nbsp;寻找连续的降序或升序序列 (4.3.2)&nbsp;<br />最后只剩下[14]这个元素：[1,2,5,6,7,8,10,12] [3,4,9,11,13,15,16] [14]&nbsp;<br />=&gt;&nbsp;入栈 (4.3.4)&nbsp;<br />当前入栈的区块大小为[8,7,1]&nbsp;<br />=&gt;&nbsp;进入merge循环 (4.3.5)&nbsp;<br />merge因为runLen[0]&lt;=runLen[1]+runLen[2]&nbsp;<br />因为runLen[0]&gt;runLen[2]，所以将run1和run2先合并。（否则将run0和run1先合并）&nbsp;<br />1) gallopRight &amp; 2) gallopLeft&nbsp;<br />这样需要排序的元素剩下[13,15] [14]，然后进行mergeHigh&nbsp;<br />完成之后的结果：&nbsp;<br />[1,2,5,6,7,8,10,12] [3,4,9,11,13,14,15,16]&nbsp;当前入栈的区块为[8,8]&nbsp;<br />=&gt;&nbsp;<br />继续merge因为runLen[0]&lt;=runLen[1]&nbsp;<br />1) gallopRight &amp; 2) gallopLeft&nbsp;<br />需要排序的元素剩下[5,6,7,8,10,12] [3,4,9,11]，然后进行mergeHigh&nbsp;<br />完成之后的结果：&nbsp;<br />[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]&nbsp;当前入栈的区块大小为[16]&nbsp;<br />=&gt;&nbsp;<br />不需要final merge因为当前栈大小为1&nbsp;<br />=&gt;&nbsp;<br />结束</p></blockquote><p><strong>6. 如何重现文章开始提到的Exception</strong></p><p>这一节将剥离复杂的业务逻辑，用一个最简单的例子（不修改TimSort.java内置的各种参数）重现文章开始提到的Exception。因为尽管google出来的结果中非常多的人提到了这个Exception及解决方案，但并没有人给出一个可以重现的例子和测试数据。另一方面，我也想从其他角度来加深对这个问题的理解。</p><p>构造测试数据的过程是个反人类的过程:( 大家不要学我。。</p><p>以下是能重现这个问题的代码：</p><blockquote><p>public class ReproJava7Exception {&nbsp;<br />&nbsp;&nbsp;&nbsp; public static void main(String[] args) {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] sample = new int[]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,1,0,-2,0,0,0,0};&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i : sample)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(i);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // use the native TimSort in JDK 7&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collections.sort(list, new Comparator&lt;Integer&gt;() {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int compare(Integer o1, Integer o2) {&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // miss the o1 = o2 case on purpose&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return o1 &gt; o2 ? 1 : -1;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });&nbsp;<br />&nbsp;&nbsp;&nbsp; }&nbsp;<br />}</p></blockquote><p><strong><a name="baidusnap3"></a><strong style="background-color: #ff9999;">7.</strong>&nbsp;Sample Code</strong></p><p>这篇文章的所有代码可以到github：<a name="baidusnap0"></a><a href="https://github.com/Huang-Wei/understanding-timsort-java7">https://github.com/Huang-Wei/understanding-<strong style="color: black; background-color: #ffff66;">timsort-java7</strong></a>下载。</p><p><strong>8. References</strong></p><p><a href="http://en.wikipedia.org/wiki/Timsort">http://en.wikipedia.org/wiki/Timsort</a>&nbsp;<br /><a name="baidusnap4"></a><a href="http://www.geneffects.com/briarskin/theory/binary/index.html">http://www.geneffects.com/briarskin/theory/binary/index<strong style="color: black; background-color: #ff66ff;">.html</strong></a>&nbsp;<br /><a href="http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare%28T,%20T%29">http://docs.oracle.com/javase/6/docs/api/java/util/Comparator<strong style="color: black; background-color: #ff66ff;">.html</strong>#compare%28T,%20T%29</a>&nbsp;<br /><a href="http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source">http://www.oracle.com/technetwork/java/javase/compatibility-417013<strong style="color: black; background-color: #ff66ff;">.html</strong>#source</a></p><small>分类：<a href="http://www.lifebackup.cn/category/programming" title="查看01呓语中的全部文章" rel="category tag">01呓语</a>&nbsp;| 标签：&nbsp;<a href="http://www.lifebackup.cn/tag/java" rel="tag">java</a>、<a href="http://www.lifebackup.cn/tag/java7" rel="tag">java7</a>、<a href="http://www.lifebackup.cn/tag/timsort" rel="tag">timsort</a>&nbsp;|</small></article><article id="comments" style="font-family: STHeiti; font-size: medium; line-height: normal;"><h3>9条评论</h3><ol><li even="" thread-even=""  depth-1"="" id="comment-213"><div id="div-comment-213"><div vcard"=""><img alt="" src="http://1.gravatar.com/avatar/b70f00bec3cb4cde6d19d39bb9b30bbf?s=24&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D24&amp;r=G" avatar-24=""  photo"="" height="24" width="24" />	<cite>hute</cite>说道：</div><div commentmetadata"=""><a href="http://www.lifebackup.cn/timsort-java7.html/comment-page-1#comment-213">三月 2, 20134:09 下午</a></div><p>太好了,找了一天.感谢.</p><div></div></div></li><li odd="" alt="" thread-odd="" thread-alt=""  depth-1"="" id="comment-214"><div id="div-comment-214"><div vcard"=""><img alt="" src="http://1.gravatar.com/avatar/b70f00bec3cb4cde6d19d39bb9b30bbf?s=24&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D24&amp;r=G" avatar-24=""  photo"="" height="24" width="24" />	<cite>hute</cite>说道：</div><div commentmetadata"=""><a href="http://www.lifebackup.cn/timsort-java7.html/comment-page-1#comment-214">三月 2, 20134:10 下午</a></div><p>重现bug的方法确实很逆天,作者花了很大力气吧.</p><div></div></div></li><li byuser="" comment-author-superpippo="" bypostauthor="" even="" thread-even=""  depth-1"="" id="comment-215"><div id="div-comment-215"><div vcard"=""><img alt="" src="http://1.gravatar.com/avatar/9ee056bde9be63bee817f63bd05903b9?s=24&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D24&amp;r=G" avatar-24=""  photo"="" height="24" width="24" />	<cite><a href="http://www.lifebackup.cn/" rel="external nofollow">superpippo</a></cite>说道：</div><div commentmetadata"=""><a href="http://www.lifebackup.cn/timsort-java7.html/comment-page-1#comment-215">三月 4, 201310:56 上午</a></div><p>@hute 所以说这个过程是很反人类的。。。</p><div></div></div></li><li odd="" alt="" thread-odd="" thread-alt=""  depth-1"="" id="comment-218"><div id="div-comment-218"><div vcard"=""><img alt="" src="http://0.gravatar.com/avatar/491a0b3c311bb72a02f60950ae77b526?s=24&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D24&amp;r=G" avatar-24=""  photo"="" height="24" width="24" />	<cite>cjnetwork</cite>说道：</div><div commentmetadata"=""><a href="http://www.lifebackup.cn/timsort-java7.html/comment-page-1#comment-218">三月 13, 201311:41 下午</a></div><p>你好，我测试了一下你提供的测试代码，发现还是不能复现这个异常情况，能否帮忙一下呢。</p><p>以下是我的jdk：<br />java version &#8220;1.<strong style="background-color: #ff9999;">7.</strong>0-ea&#8221;<br />Java(TM) SE Runtime Environment (build 1.<strong style="background-color: #ff9999;">7.</strong>0-ea-b45)<br />Java HotSpot(TM) Client VM (build 14.0-b10, mixed mode, sharing)</p><div></div></div></li><li byuser="" comment-author-superpippo="" bypostauthor="" even="" thread-even=""  depth-1"="" id="comment-220"><div id="div-comment-220"><div vcard"=""><img alt="" src="http://1.gravatar.com/avatar/9ee056bde9be63bee817f63bd05903b9?s=24&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D24&amp;r=G" avatar-24=""  photo"="" height="24" width="24" />	<cite><a href="http://www.lifebackup.cn/" rel="external nofollow">superpippo</a></cite>说道：</div><div commentmetadata"=""><a href="http://www.lifebackup.cn/timsort-java7.html/comment-page-1#comment-220">三月 17, 20139:30 下午</a></div><p>@cjnetwork 我在jdk 1.<strong style="background-color: #ff9999;">7.</strong>0_17上用ReproJava7Exception.java能重现这个问题<br />我猜测你不能重现有两种可能：<br />1) 你的这个jdk版本有点诡异(1.<strong style="background-color: #ff9999;">7.</strong>0-ea)，尝试升到最1.7的正式版本<br />2) 确认你在编译时候使用的是JDK7，而不是JDK6 &#8211; 因为有可能在Eclipse或别的IDE中并没有设置正确。你可以写一段switch string的小例子看看有没有编译错误</p><div></div></div></li><li odd="" alt="" thread-odd="" thread-alt=""  depth-1"="" id="comment-581"><div id="div-comment-581"><div vcard"=""><img alt="" src="http://1.gravatar.com/avatar/9eddcbacf9380027b144137462e4fd99?s=24&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D24&amp;r=G" avatar-24=""  photo"="" height="24" width="24" />	<cite><a href="http://blog.csdn.net/ghsau" rel="external nofollow">ghsau</a></cite>说道：</div><div commentmetadata"=""><a href="http://www.lifebackup.cn/timsort-java7.html/comment-page-1#comment-581">十二月 21, 201411:06 上午</a></div><p>compare实现只需要这样:<br />return o1.getValue() &#8211; o2.getValue();<br />不需要自己判断.</p><div></div></div></li><li byuser="" comment-author-superpippo="" bypostauthor="" even="" thread-even=""  depth-1"="" id="comment-583"><div id="div-comment-583"><div vcard"=""><img alt="" src="http://1.gravatar.com/avatar/9ee056bde9be63bee817f63bd05903b9?s=24&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D24&amp;r=G" avatar-24=""  photo"="" height="24" width="24" />	<cite><a href="http://www.lifebackup.cn/" rel="external nofollow">superpippo</a></cite>说道：</div><div commentmetadata"=""><a href="http://www.lifebackup.cn/timsort-java7.html/comment-page-1#comment-583">一月 14, 201510:24 下午</a></div><p>@ghsau 是的</p></div></li></ol></article><img src ="http://www.blogjava.net/xiaomage234/aggbug/423060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2015-02-26 18:46 <a href="http://www.blogjava.net/xiaomage234/archive/2015/02/26/423060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[译]理解timsort, 第一部分：适应性归并排序(Adaptive Mergesort)</title><link>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423059.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 26 Feb 2015 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423059.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/423059.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/423059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/423059.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Python2.3中开始使用的timsort应该说算是声名在外了，不管是在稳定性还是在速度上都十分的惊人。前一段刚刚看了《Python CookBook》中的一些章节，对timsort产生了一些兴趣。于是在网上看到了这边文章，讲的相当清楚明了，于是产生了翻译的念头，也于是有了这篇文章。这应该算是我翻译的第一篇技术文章，真正做一次才明白能看懂和能翻译出来还是有蛮大的差距的。翻译质量不可谓不差，诸位如...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2015/02/26/423059.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/423059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2015-02-26 18:30 <a href="http://www.blogjava.net/xiaomage234/archive/2015/02/26/423059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenJDK 源代码阅读之 TimSort</title><link>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423051.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 26 Feb 2015 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423051.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/423051.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2015/02/26/423051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/423051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/423051.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 概要这个类在 Oracle 的官方文档里是查不到的，但是确实在&nbsp;OpenJDK&nbsp;的源代码里出现了，Arrays&nbsp;中的&nbsp;sort&nbsp;函数用到了这个用于排序的类。它将归并排序(merge sort) 与插入排序(insertion sort) 结合，并进行了一些优化。对于已经部分排序的数组，时间复杂度远低于&nbsp;O(n log(n))，最好可达&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2015/02/26/423051.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/423051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2015-02-26 15:59 <a href="http://www.blogjava.net/xiaomage234/archive/2015/02/26/423051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>