<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>阅微堂 &#187; 数据结构</title>
	<atom:link href="http://zhiqiang.org/blog/tag/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84/feed" rel="self" type="application/rss+xml" />
	<link>http://zhiqiang.org/blog</link>
	<description>zhiqiang&#039;s personal blog</description>
	<lastBuildDate>Thu, 02 Sep 2010 00:59:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>编程的核心是数据结构，而不是算法</title>
		<link>http://zhiqiang.org/blog/science/computer-science/programs-depend-on-date-struct-not-algorithm.html</link>
		<comments>http://zhiqiang.org/blog/science/computer-science/programs-depend-on-date-struct-not-algorithm.html#comments</comments>
		<pubDate>Thu, 28 Feb 2008 00:15:24 +0000</pubDate>
		<dc:creator>zhiqiang</dc:creator>
				<category><![CDATA[计算机科学]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://zhiqiang.org/blog/posts/programs-depend-on-date-struct-not-algorithm.html</guid>
		<description><![CDATA[Rob Pike, 最伟大的 C 语言大师之一 , 在Notes on C Programming(英文原文)中从另一个稍微不同的角度表述了 Unix 的哲学:

你无法断定程序会在什么地方耗费运行时间。瓶颈经常出现在想不到的地方，所以别急于胡乱找个地方改代码，除非你已经证实那儿就是瓶颈所在。  
估量。在你没对代码进行估量，特别是没找到最耗时的那部分之前，别去优化速度。  
花哨的算法在 n 很小时通常很...]]></description>
			<content:encoded><![CDATA[<p>Rob Pike, 最伟大的 C 语言大师之一 , 在<a href="http://www.huachu.com.cn/2005/2005unix.htm" target="_blank"><em>Notes on C Programming</em></a>(<a href="http://www.lysator.liu.se/c/pikestyle.html" target="_blank">英文原文</a>)中从另一个稍微不同的角度表述了 Unix 的哲学:
<ol>
<li>你无法断定程序会在什么地方耗费运行时间。瓶颈经常出现在想不到的地方，所以别急于胡乱找个地方改代码，除非你已经证实那儿就是瓶颈所在。  </li>
<li>估量。在你没对代码进行估量，特别是没找到最耗时的那部分之前，别去优化速度。  </li>
<li>花哨的算法在 n 很小时通常很慢，而 n 通常很小。花哨算法的常数复杂度很大。除非你确定 n 总是很大，否则不要用花哨算法（即使 n 很大，也优先考虑原则 2 ）。  </li>
<li>花哨的算法比简单算法更容易出 bug 、更难实现。尽量使用简单的算法配合简单的数据结构。  </li>
<li>数据压倒一切。如果已经选择了正确的数据结构并且把一切都组织得井井有条，正确的算法也就不言自明。编程的核心是数据结构，而不是算法。  </li>
<li>没有原则 6 。 </li>
</ol>
<p>Ken Thompson —— Unix 最初版本的设计者和实现者，禅宗偈语般地对 Pike 的原则4 作了强调：  </p>
<p align="center"><strong><font size="4">拿不准就穷举</font></strong></p>
<p>via: newsmth-algorithm</p>
<p><a href="http://www.huachu.com.cn/2005/2005unix.htm"></a></p>
<div><h2>相关文章</h2><ul><li><a href="http://zhiqiang.org/blog/science/computer-science/3-color-a-simple-graph.html">一个简单图的三染色算法问题</a> <small>注: 这个问题来自China Theory Week 2008的Open Problems Session。 我们知道在数学里证明一个东西的存在性的时候，有时候只证明了“存在性”，而且在证明过程...</small></li><li><a href="http://zhiqiang.org/blog/science/mathmatics-in-rubik-cube-and-algorithm.html">魔方里的数学</a> <small>今天香港中文大学的Prof. Cai给我们上graph algorithm。第一节课上教我们玩魔方，先给每人发了一个。我喜欢这样的教学...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/graph-isomorphism-is-polynomial.html">图同构问题属于P？</a> <small>更新：证明的关键一步发现错误，作者更新了论文，结论甚至论文标题都改了（废话），新版本On the graph isomorphism problem。  提交论文到arxiv不需要审阅...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/complexity-of-prime-sieve.html">素数筛法的复杂度</a> <small>Xie Xie给我看了一个链接性能调优--永远超乎想象，里面提到了素数筛法的复杂度，作者用实验发现此筛法是线形的。 所谓素数筛法就是那个求小于n的...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/another-perfect-shuffle-algorithm.html">Perfect Shuffle的算法</a> <small>珍爱生命，远离政治。我们继续讨论算法。 2008/04/01补充：此算法有重大缺陷。详情请见留言部分。 一年前，我们讨论过一个算法问题，perfect shuffle，...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/median-algorithm-of-ordered-matrix.html">有序矩阵的中位数算法</a> <small>给定$$n\times n$$的实数矩阵，每行和每列都是递增的，求这$$n^2$$个数的中位数。 使用类似Tarjan的线性中位数的方法，每次找每列中位数，然后找中位数...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/preliminary-computer-theory-algorithms-and-calculation-model.html">理论计算机初步：算法和计算模型</a> <small>
下面是wikipedia上算法的定义：

算法是指完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据，经过计算机程序的有限次运算...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/download-encyclopedia-of-algorithm.html">算法百科全书 - Encyclopedia of Algorithms</a> <small>Xie Xie推荐了一本今年出版的一本新书，Encyclopedia of Algorithms，全书1200页，涵盖各类有名问题的算法，概率算法，近似算法，量子算法等。 翻了一下，...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/an-algorithm-face-interviews-question-test.html">一个算法面试题 &#038; 面试题库</a> <small>一个面试题，号称是微软的  输入$$a_1, a_2, ..., a_n, b_1, b_2, ..., b_n$$，如何在O(n)的时间，用O(1)的空间，将这个序列顺序改为$$a_1, b_1, ..., a_n, b_n$$。 刚一...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/tcs-classroom-notes-database-storage-problems.html">TCS课堂笔记：数据库存储问题</a> <small>理论计算机(I)课上讲的一个问题，很有意思。 已经一个n，m和$$\{1,2,\cdots, m\}$$里n个数，设计一种保存这n个元素的表的数据结构形式，使得对$$\{1,2,\cdots...</small></li></ul></div>    <p></p>
    <hr noshade style="margin:0;height:1px" />
    <p>&copy; zhiqiang for <a href="http://zhiqiang.org/blog">阅微堂</a>, 2008. | <a href="http://zhiqiang.org/blog/science/computer-science/programs-depend-on-date-struct-not-algorithm.html">&#38142;&#25509;</a> | <a href="http://zhiqiang.org/blog/science/computer-science/programs-depend-on-date-struct-not-algorithm.html#comments">12 &#26465;&#35780;&#35770;</a></p>]]></content:encoded>
			<wfw:commentRss>http://zhiqiang.org/blog/science/computer-science/programs-depend-on-date-struct-not-algorithm.html/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>TCS课堂笔记：数据库存储问题</title>
		<link>http://zhiqiang.org/blog/science/computer-science/tcs-classroom-notes-database-storage-problems.html</link>
		<comments>http://zhiqiang.org/blog/science/computer-science/tcs-classroom-notes-database-storage-problems.html#comments</comments>
		<pubDate>Tue, 08 May 2007 10:04:13 +0000</pubDate>
		<dc:creator>zhiqiang</dc:creator>
				<category><![CDATA[计算机科学]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[理论计算机笔记]]></category>

		<guid isPermaLink="false">http://zhiqiang.org/blog/587.html</guid>
		<description><![CDATA[理论计算机(I)课上讲的一个问题，很有意思。
已经一个n，m和里n个数，设计一种保存这n个元素的表的数据结构形式，使得对中任何一个数，可以最少的查询次数（每次查询，可以选择一个位置，然后你能知道表中这个位置的数据），获知这个数是否在表中。
如果设计这个表为有序表，用二分法需要次查询。
有序表是最优的么？
举一个例子，一个保存1，2，3里面的两个数的...]]></description>
			<content:encoded><![CDATA[<p>理论计算机(I)课上讲的一个问题，很有意思。</p>
<p>已经一个n，m和<img src="http://zhiqiang.org/blog/wp-content/cache/tex_d43069858d2a796ab1b977f3684de967.png" style="vertical-align:middle; " class="tex" alt="\{1,2,\cdots, m\}" />里n个数，设计一种保存这n个元素的表的数据结构形式，使得对<img src="http://zhiqiang.org/blog/wp-content/cache/tex_d43069858d2a796ab1b977f3684de967.png" style="vertical-align:middle; " class="tex" alt="\{1,2,\cdots, m\}" />中任何一个数，可以最少的查询次数（每次查询，可以选择一个位置，然后你能知道表中这个位置的数据），获知这个数是否在表中。</p>
<p>如果设计这个表为有序表，用二分法需要<img src="http://zhiqiang.org/blog/wp-content/cache/tex_0d2e858bd7f89eed5461e5637d6e0a50.png" style="vertical-align:middle; padding-bottom:1px;" class="tex" alt="\log n" />次查询。</p>
<p>有序表是最优的么？</p>
<p>举一个例子，一个保存1，2，3里面的两个数的有序表，要想知道2是否在这个表里面，至少需要两次查询。可不可以用一种特定的数据结构，使得一次查询就能判定任何一个数是不是在数据库里面？</p>
<p>结论是可能的，见下图：</p>
<p align="center"><a title="sorted table" href="http://www.flickr.com/photos/51234757@N00/489673515/"><img alt="sorted table" src="http://static.flickr.com/189/489673515_9cc3702472.jpg" border="0"/></a></p>
<p>一般的，假如表里的n个数的范围是1，2，...，2n-2，即<img src="http://zhiqiang.org/blog/wp-content/cache/tex_01e42101c7214aaa22d1f8fc3eeb5a15.png" style="vertical-align:middle; padding-bottom:1px;" class="tex" alt="m=2n-2" />，可以设计一种方法，使得，对于任何一个数，<strong>只需要查询一次</strong>，便能知道这个数是否在这个表里面。</p>
<p>课堂上有同学当场就想出设计方法，向他致敬！</p>
<p>另外，利用广义的Ramsey定理，对于固定的n，能够证明当m足够大时，无论你怎么设计那个表的结构，也至少需要<img src="http://zhiqiang.org/blog/wp-content/cache/tex_0d2e858bd7f89eed5461e5637d6e0a50.png" style="vertical-align:middle; padding-bottom:1px;" class="tex" alt="\log n" />的查询次数。</p>
<p>一个很神奇的问题。相关论文<a href="http://ftp.cs.umd.edu/~gasarch/ramsey/tables.pdf" target="_blank">Should Table be Sorted?</a>, 上面的图片也来自这篇文章。</p>
<p></p>
<div><h2>相关文章</h2><ul><li><a href="http://zhiqiang.org/blog/science/how-n-people-divide-a-cake-fairly.html">征集3个人分蛋糕的方法</a> <small> Yao在课程《理论计算机II》的第一节课上提到的一个问题：  三个人如何平分一块蛋糕？ 要求每个人拿到不少于1/3的蛋糕——这里指的是每个人认为自...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/programs-depend-on-date-struct-not-algorithm.html">编程的核心是数据结构，而不是算法</a> <small>Rob Pike, 最伟大的 C 语言大师之一 , 在Notes on C Programming(英文原文)中从另一个稍微不同的角度表述了 Unix 的哲学:   你无法断定程序会在什么地方耗费运...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/boxes-problem-on-static-data-structure-problems.html">摸箱子问题以及在Static data structure problems上的应用</a> <small>以前提到过，理论计算机这门课会邀请一些正在这边访问的教授来讲课，由于是本科生，所以这些教授一般都是讲些有趣的东西，比如之前的overhang 堆...</small></li><li><a href="http://zhiqiang.org/blog/science/computer-science/tcs-byzantine-failure-the-byzantine-generals-problem.html">TCS: 拜占庭将军问题 (The Byzantine Generals Problem)</a> <small>这个问题在Yao的理论计算机课上整整讨论了2节课。它是一个算法设计问题，也极具趣味性。下面是它的一些介绍和解决方案([1])。

拜占庭帝国就是5...</small></li><li><a href="http://zhiqiang.org/blog/science/the-perfect-number-of-shuffling-7-times.html">&quot;完美&quot;的洗牌次数 - 7次</a> <small>在大家玩牌的时候，每一局之前都需要重新洗牌——一次洗牌指将牌分为左右两垛然后穿插放牌，但多少次洗牌才是正当的呢？就我多次打牌的观察，...</small></li><li><a href="http://zhiqiang.org/blog/science/tcs-classroom-notes-the-best-dating-strategy.html">最佳约会策略</a> <small>题外话：最近阅微堂发的都是网友转发的政治方面的文章，不爱看的人会比较痛苦。现在讨论一个轻松一点的话题。其问题，已经被研究了很多年，有...</small></li></ul></div>    <p></p>
    <hr noshade style="margin:0;height:1px" />
    <p>&copy; zhiqiang for <a href="http://zhiqiang.org/blog">阅微堂</a>, 2007. | <a href="http://zhiqiang.org/blog/science/computer-science/tcs-classroom-notes-database-storage-problems.html">&#38142;&#25509;</a> | <a href="http://zhiqiang.org/blog/science/computer-science/tcs-classroom-notes-database-storage-problems.html#comments">5 &#26465;&#35780;&#35770;</a></p>]]></content:encoded>
			<wfw:commentRss>http://zhiqiang.org/blog/science/computer-science/tcs-classroom-notes-database-storage-problems.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
