<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2" -->
<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/"
	>

<channel>
	<title>Algo Blog</title>
	<link>http://www.algoblog.com</link>
	<description>Algorithms are the language of nature.</description>
	<pubDate>Tue, 31 Jul 2007 03:02:05 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<item>
		<title>Stay tuned!</title>
		<link>http://www.algoblog.com/2007/07/30/stay-tuned/</link>
		<comments>http://www.algoblog.com/2007/07/30/stay-tuned/#comments</comments>
		<pubDate>Tue, 31 Jul 2007 03:02:05 +0000</pubDate>
		<dc:creator>Algo Blog</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.algoblog.com/2007/07/30/stay-tuned/</guid>
		<description><![CDATA[Hey everyone,
Thanks for still keeping tabs on me.  I&#8217;ll post something tomorrow morning.  Stay tuned!
]]></description>
			<content:encoded><![CDATA[<p>Hey everyone,</p>
<p>Thanks for still keeping tabs on me.  I&#8217;ll post something tomorrow morning.  Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.algoblog.com/2007/07/30/stay-tuned/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Real estate optimization</title>
		<link>http://www.algoblog.com/2007/06/13/real-estate-optimization/</link>
		<comments>http://www.algoblog.com/2007/06/13/real-estate-optimization/#comments</comments>
		<pubDate>Wed, 13 Jun 2007 15:09:47 +0000</pubDate>
		<dc:creator>Algo Blog</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.algoblog.com/2007/06/13/real-estate-optimization/</guid>
		<description><![CDATA[Suppose you are a real estate developer.  These days, the market is getting tight so you have decided to turn to algorithms to give you an edge over the competition.  You have purchased an irregularly shaped plot of land which you have divided into a square grid.  For each square, you have [...]]]></description>
			<content:encoded><![CDATA[<p>Suppose you are a real estate developer.  These days, the market is getting <a href="http://en.wikipedia.org/wiki/Subprime_meltdown">tight</a> so you have decided to turn to algorithms to give you an edge over the competition.  You have purchased an irregularly shaped plot of land which you have divided into a square grid.  For each square, you have calculated a cost.  For example, building where the ground is less stable will cost you more.  However, building on a square also has some value to you.  For full generality, each square could have its own value as well.  For example, a square overlooking the sea might be great to build on.  As a simplifying assumption, you&#8217;ve decided that the value of a house is the value of the sum of its squares.</p>
<p>You wish to build a rectangular house with the greatest net value (value - cost).  How can you do this efficiently?  Here&#8217;s an example where we&#8217;ve pre-combined cost and value:</p>
<table border="1" width="80%" style="table-layout:fixed;text-align:right;border-spacing:0;empty-cells:hide">
<tr>
<td></td>
<td></td>
<td>-9</td>
<td>3</td>
<td>-9</td>
<td>6</td>
<td>8</td>
<td>6</td>
<td>0</td>
<td>-8</td>
<td>-1</td>
<td>-6</td>
<td>-7</td>
<td>8</td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>-8</td>
<td>-8</td>
<td>4</td>
<td>-6</td>
<td>0</td>
<td>5</td>
<td>3</td>
<td>5</td>
<td>-3</td>
<td>-5</td>
<td>-4</td>
<td>-10</td>
<td>6</td>
<td>-2</td>
</tr>
<tr>
<td>-1</td>
<td>9</td>
<td>-6</td>
<td>-2</td>
<td>-10</td>
<td>-6</td>
<td>5</td>
<td>-7</td>
<td>-1</td>
<td>-8</td>
<td>0</td>
<td>-10</td>
<td>-4</td>
<td>9</td>
<td>-2</td>
</tr>
<tr>
<td>6</td>
<td>-7</td>
<td>10</td>
<td>-5</td>
<td>4</td>
<td>4</td>
<td>-7</td>
<td>-2</td>
<td>-6</td>
<td>4</td>
<td>-5</td>
<td>-3</td>
<td>10</td>
<td>10</td>
<td>7</td>
</tr>
<tr>
<td>-1</td>
<td>-3</td>
<td>1</td>
<td bgcolor="#00FF00">7</td>
<td bgcolor="#00FF00">6</td>
<td bgcolor="#00FF00">2</td>
<td bgcolor="#00FF00">3</td>
<td bgcolor="#00FF00">-5</td>
<td bgcolor="#00FF00">7</td>
<td bgcolor="#00FF00">-6</td>
<td bgcolor="#00FF00">5</td>
<td>2</td>
<td>4</td>
<td>-4</td>
<td>2</td>
</tr>
<tr>
<td>-5</td>
<td>10</td>
<td>-7</td>
<td bgcolor="#00FF00">-3</td>
<td bgcolor="#00FF00">7</td>
<td bgcolor="#00FF00">4</td>
<td bgcolor="#00FF00">-4</td>
<td bgcolor="#00FF00">1</td>
<td bgcolor="#00FF00">1</td>
<td bgcolor="#00FF00">-5</td>
<td bgcolor="#00FF00">5</td>
<td>-8</td>
<td>-9</td>
<td>0</td>
<td>-9</td>
</tr>
<tr>
<td>-3</td>
<td>-8</td>
<td>-8</td>
<td bgcolor="#00FF00">1</td>
<td bgcolor="#00FF00">-5</td>
<td bgcolor="#00FF00">-4</td>
<td bgcolor="#00FF00">6</td>
<td bgcolor="#00FF00">2</td>
<td bgcolor="#00FF00">0</td>
<td bgcolor="#00FF00">-3</td>
<td bgcolor="#00FF00">8</td>
<td>6</td>
<td>-5</td>
<td>-7</td>
<td>6</td>
</tr>
<tr>
<td>2</td>
<td>-3</td>
<td>-3</td>
<td bgcolor="#00FF00">9</td>
<td bgcolor="#00FF00">9</td>
<td bgcolor="#00FF00">10</td>
<td bgcolor="#00FF00">4</td>
<td bgcolor="#00FF00">7</td>
<td bgcolor="#00FF00">-5</td>
<td bgcolor="#00FF00">8</td>
<td bgcolor="#00FF00">4</td>
<td>2</td>
<td>7</td>
<td>-6</td>
<td>10</td>
</tr>
<tr>
<td>-8</td>
<td>-1</td>
<td>9</td>
<td bgcolor="#00FF00">2</td>
<td bgcolor="#00FF00">-8</td>
<td bgcolor="#00FF00">4</td>
<td bgcolor="#00FF00">-1</td>
<td bgcolor="#00FF00">9</td>
<td bgcolor="#00FF00">3</td>
<td bgcolor="#00FF00">-6</td>
<td bgcolor="#00FF00">4</td>
<td>-9</td>
<td>0</td>
<td></td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>-9</td>
<td>-4</td>
<td bgcolor="#00FF00">-5</td>
<td bgcolor="#00FF00">6</td>
<td bgcolor="#00FF00">7</td>
<td bgcolor="#00FF00">-5</td>
<td bgcolor="#00FF00">-9</td>
<td bgcolor="#00FF00">5</td>
<td bgcolor="#00FF00">-1</td>
<td bgcolor="#00FF00">5</td>
<td>1</td>
<td>4</td>
<td>-6</td>
<td>4</td>
</tr>
<tr>
<td>3</td>
<td>-6</td>
<td>5</td>
<td>3</td>
<td>6</td>
<td>-8</td>
<td>-8</td>
<td>-9</td>
<td>-10</td>
<td>-10</td>
<td>-10</td>
<td>-9</td>
<td>-4</td>
<td>8</td>
<td>9</td>
</tr>
<tr>
<td>8</td>
<td>1</td>
<td>3</td>
<td>4</td>
<td>10</td>
<td>3</td>
<td>0</td>
<td>8</td>
<td>0</td>
<td>4</td>
<td>6</td>
<td>-2</td>
<td>-3</td>
<td>4</td>
<td>-5</td>
</tr>
<tr>
<td>-6</td>
<td>-1</td>
<td>0</td>
<td>4</td>
<td>-2</td>
<td>-6</td>
<td>7</td>
<td>-7</td>
<td>1</td>
<td>-2</td>
<td>-10</td>
<td>4</td>
<td>-4</td>
<td>0</td>
<td>-5</td>
</tr>
<tr>
<td></td>
<td></td>
<td>-8</td>
<td>-5</td>
<td>5</td>
<td>-8</td>
<td>2</td>
<td>4</td>
<td>9</td>
<td>8</td>
<td>-4</td>
<td>-6</td>
<td>10</td>
<td>-7</td>
<td>-6</td>
</tr>
<tr>
<td></td>
<td>10</td>
<td>-6</td>
<td>-10</td>
<td>5</td>
<td>-1</td>
<td>4</td>
<td>-4</td>
<td>10</td>
<td>1</td>
<td>-1</td>
<td>-3</td>
<td>-9</td>
<td>7</td>
<td></td>
</tr>
</table>
<p>The max sum is highlighted and it&#8217;s 86.</p>
<p>Think for a few minutes before reading below&#8230;</p>
<p> <a href="http://www.algoblog.com/2007/06/13/real-estate-optimization/#more-12" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.algoblog.com/2007/06/13/real-estate-optimization/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Finding an enclosing interval</title>
		<link>http://www.algoblog.com/2007/06/08/finding-an-enclosing-interval/</link>
		<comments>http://www.algoblog.com/2007/06/08/finding-an-enclosing-interval/#comments</comments>
		<pubDate>Fri, 08 Jun 2007 15:16:16 +0000</pubDate>
		<dc:creator>Algo Blog</dc:creator>
		
		<category><![CDATA[interview]]></category>

		<category><![CDATA[classic]]></category>

		<guid isPermaLink="false">http://www.algoblog.com/2007/06/08/finding-an-enclosing-interval/</guid>
		<description><![CDATA[A question often asked in interviews is: what&#8217;s the best way to store a set?  There are many different ways to store well-ordered data so that it can be queried quickly.  Many people find that a hash table gives them the best performance characteristics, so much so that if you are in an [...]]]></description>
			<content:encoded><![CDATA[<p>A question often asked in interviews is: what&#8217;s the best way to store a set?  There are many different ways to store well-ordered data so that it can be queried quickly.  Many people find that a hash table gives them the best performance characteristics, so much so that if you are in an interview and answer with anything else, you will immediately raise the suspicions of the interviewer.  However, assuming you have a good hash function, a hash table still has one key flaw: it really doesn&#8217;t tell you anything about your relative neighbors.  This means that you can&#8217;t easily extract an ordered list out of a hash table.  You could query all possible keys in order, but this will give you abysmal performance.  Furthermore, if you use e.g. a dictionary (strcmp) ordering of strings, you will have an infinite number of keys between any two finite keys.  That makes exhaustive search impossible.</p>
<p>But besides extracting an ordered list, there are other uses for having neighbor access.  Suppose, for example, you had a set of non-overlapping time intervals which represent different policies in effect at Company X.  Each time interval has some starting time as well as an ending time.  Now, given a moment in time, you would like to find the time interval that contains it, if there is one; this corresponds to the policy which was in effect at that time.  (Assume for now that if the interval starts at a query moment, it contains that moment.)  What is a good data structure which would allow you to efficiently add new time intervals and query moments in time intervals?</p>
<p>Think for a few minutes before reading below&#8230;</p>
<p> <a href="http://www.algoblog.com/2007/06/08/finding-an-enclosing-interval/#more-10" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.algoblog.com/2007/06/08/finding-an-enclosing-interval/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A few tweaks</title>
		<link>http://www.algoblog.com/2007/06/07/a-few-tweaks/</link>
		<comments>http://www.algoblog.com/2007/06/07/a-few-tweaks/#comments</comments>
		<pubDate>Fri, 08 Jun 2007 03:58:15 +0000</pubDate>
		<dc:creator>Algo Blog</dc:creator>
		
		<category><![CDATA[minutiae]]></category>

		<guid isPermaLink="false">http://www.algoblog.com/2007/06/07/a-few-tweaks/</guid>
		<description><![CDATA[I&#8217;ve made a few tweaks to the blog.  There are a few minor cosmetic changes.  Also, comments are now protected using WP HashCash.  Contact me via email if you have trouble.
I&#8217;m preparing a new algorithm post which should be ready within 12 hours.  Stay tuned!
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve made a few tweaks to the blog.  There are a few minor cosmetic changes.  Also, comments are now protected using <a href="http://wordpress-plugins.feifei.us/hashcash/">WP HashCash</a>.  Contact me via email if you have trouble.</p>
<p>I&#8217;m preparing a new algorithm post which should be ready within 12 hours.  Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.algoblog.com/2007/06/07/a-few-tweaks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Random Permutation</title>
		<link>http://www.algoblog.com/2007/06/04/permutation/</link>
		<comments>http://www.algoblog.com/2007/06/04/permutation/#comments</comments>
		<pubDate>Mon, 04 Jun 2007 13:32:36 +0000</pubDate>
		<dc:creator>Algo Blog</dc:creator>
		
		<category><![CDATA[interview]]></category>

		<category><![CDATA[classic]]></category>

		<guid isPermaLink="false">http://www.algoblog.com/2007/06/04/permutation/</guid>
		<description><![CDATA[So, I&#8217;ve totally been writing this blog for almost a week, but so far I haven&#8217;t talked about how an actual algorithm works.  Here&#8217;s a classic algorithm.
Let&#8217;s say you have an array of n elements a[0] through a[n-1].  You would like to generate a random permutation of this array.  This means that [...]]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;ve totally been writing this blog for almost a week, but so far I haven&#8217;t talked about how an actual algorithm works.  Here&#8217;s a classic algorithm.</p>
<p>Let&#8217;s say you have an array of <em>n</em> elements <strong>a</strong>[0] through <strong>a</strong>[<em>n</em>-1].  You would like to generate a random permutation of this array.  This means that any ordering of the array is equally probable, which means that if you look at any position in <strong>a</strong>, any element has an equal chance of being there: 1 in <em>n</em> (1/<em>n</em>).  We assume that we have the function <em>r</em>(<em>n</em>) which generates a uniform random integer between 0 and <em>n</em>-1, inclusive.  (In C, you could do this with <tt>random() % n</tt>, and in Java you&#8217;d do <tt>(int)(Math.random() * n)</tt>.)</p>
<p>On two occasions while interviewing, I have been asked for an algorithm to permute an array.  Both times the interviewer was amazed when I showed them this algorithm.  Many people assume that a second storage array is necessary for remembering numbers you have picked, but you can do it in place with no memory.  The algorithm (usually credited to Knuth, but see below) is quite simple:</p>
<ul>
<li>For i = 1 to n-1:
<ul>
<li>Let j = r(i+1)</li>
<li>Swap a[i] and a[j]</li>
</ul>
</li>
</ul>
<p>My guess as to why more people don&#8217;t know it is due to its interesting use of induction.  Software engineers generally learn of induction in college, fear it, learn how to parrot back enough to pass the classes that use it, then promptly forget it.  But recursion is ubiquitous and unavoidable.  Whether explicitly recursing with a function calling itself, or implicitly in a loop, any time later steps assume that earlier steps have done their work over part of the data, you need induction.  Instead of fearing induction, learn how it works and learn how you can rely on it to do more with your data.</p>
<p>So how does the algorithm use induction?  Suppose we are in iteration <em>i</em>.  Assume inductively that <strong>a</strong>[0]&#8230;<strong>a</strong>[<em>i</em>-1] are a random permutation of that part of the array.  As a base case, <strong>a</strong>[0] starts as being a permutation of itself.  Now consider what the array will look like after the swap.  Element <em>i</em> has an equal chance of being in any position 0&#8230;<em>i</em>.  What about the remaining elements?  Each one has a (<em>i</em>-1)/<em>i</em> chance of standing still and a 1/<em>i</em> chance of being put in the ith spot.  If it stands still, it had a 1/(<em>i</em>-1) chance of being there by the induction hypothesis.  But multiplying this by the stand-still probability, we get a 1/<em>i</em> chance of it being there after the swap.  Together with the swap probability, this means that it has a 1/<em>i</em> chance of being in any spot, which is the definition of a uniform permutation.</p>
<p>As a side note, Wikipedia gives <a href="http://en.wikipedia.org/wiki/Knuth_shuffle">a different version</a>: </p>
<ul>
<li>For i = 0 to n-2:
<ul>
<li>Let j = i + r(n-i)</li>
<li>Swap a[i] and a[j]</li>
</ul>
</li>
</ul>
<p>This has the advantage that as soon as the <em>i</em>-loop visits a location, its value is finalized so you can output the permutation as it is being created.  The disadvantage is that it&#8217;s &#8220;less inductive&#8221; in that, after the ith iteration, you don&#8217;t have a true permutation of the first <em>i</em> elements, but only part of a permutation of all <em>n</em> elements.  Also, if you are simply generating a random permutation of the numbers 0&#8230;<em>n</em>-1 (or analogously the result of some function), you can replace a[<em>i</em>] with <em>i</em> (or <em>f</em>(<em>i</em>)) in the first version and you don&#8217;t need to initialize the array.  This doesn&#8217;t work in the second because of its &#8220;future swaps&#8221;.  This is the version that most people give.  A proof of its correctness is given <a href="http://www.cs.utexas.edu/~vlr/s07.357/notes/lec5.pdf">here</a>.</p>
<p>What are some uses of random permutations?  They can be good for generating test data, e.g. for a sorting function or any other function which should be able to deal with random data.  They can be good as a starting point for a hill-climbing algorithm, e.g. with Traveling Salesman.  And, of course, they&#8217;re great for asking about in interviews.</p>
<p><strong>Update</strong>: I&#8217;m overwhelmed by the response!  Thanks for all the replies, on here and <a href="http://programming.reddit.com/info/1w1z3/comments">Reddit</a>.  Here are some clarifications:</p>
<ul>
<li>I agree that <tt>random() % n</tt> is not perfectly uniform, but neither is <tt>(int)(Math.random() * n)</tt> due to the finite precision of the floating point number.  Both of them are pretty close for small values of n.  We could do better, but it&#8217;s outside the scope of this post.  Unlike rand, random is supposed to have good entropy in the low order bits.</li>
<li>Swapping <em>i</em> with <em>r</em>(<em>n</em>) is a simplification.  This doesn&#8217;t give you a uniform distribution, however.  As one reader mentioned, <a href="http://www.cigital.com/papers/download/developer_gambling.php">this page</a> gives the lowdown, as do several commenters on reddit.</li>
<li>Someone took issue with the first algorithm.  However, they cited that same page, which is only about the i-with-rand(n) issue (and <strong>a</strong>[<em>i</em>] remaining stationary).  If you can find a fundamental flaw with my proof, please tell!</li>
</ul>
<p>Again, thanks, and I hope you keep reading!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.algoblog.com/2007/06/04/permutation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What is an algorithm?</title>
		<link>http://www.algoblog.com/2007/05/30/what-is-an-algorithm/</link>
		<comments>http://www.algoblog.com/2007/05/30/what-is-an-algorithm/#comments</comments>
		<pubDate>Thu, 31 May 2007 04:52:20 +0000</pubDate>
		<dc:creator>Algo Blog</dc:creator>
		
		<category><![CDATA[philosophy]]></category>

		<category><![CDATA[intro]]></category>

		<guid isPermaLink="false">http://www.algoblog.com/2007/05/30/what-is-an-algorithm/</guid>
		<description><![CDATA[We all use algorithms every day, but what is an algorithm, exactly?  By my definition, an algorithm is a formalized procedure to accomplish a task (this is essentially the same as Wikipedia&#8217;s).
Not everything you do is an algorithm.  Some things we do have no known good algorithm, such as writing a blog entry. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.weallusematheveryday.com">We all use algorithms every day</a>, but what is an algorithm, exactly?  By my definition, an algorithm is a formalized procedure to accomplish a task (this is essentially the same as <a href="http://en.wikipedia.org/wiki/Algorithm">Wikipedia&#8217;s</a>).</p>
<p>Not everything you do is an algorithm.  Some things we do have no known good algorithm, such as writing a blog entry.  On the other hand, there&#8217;s an algorithm out there to write <a href="http://www.pdos.lcs.mit.edu/scigen">computer science papers</a>.  Other things do have an algorithm but we typically don&#8217;t explicitly use one.  For example, when I vacuum a carpet, I generally don&#8217;t think about how to cover the area using the minimal amount of effort, I just do it.</p>
<p>An algorithm exists for any problem which we can state formally, as long as there is a finite search space.  In this case, we can always &#8220;try all possibilities&#8221;.  <a href="http://en.wikipedia.org/wiki/Prolog">Prolog</a> will do this for you, but not necessarily very efficiently.  The fun comes when we want to create the most efficient algorithm possible according to some metric.</p>
<p>A key feature of an algorithm is that it&#8217;s deterministic.  That is, given exactly the same input, it will always give the same output.  I&#8217;m almost fibbing: some algorithms use randomness.  The most frequently used of these is probably quicksort, a method of sorting which uses randomness to help it divvy its work into roughly equal piles.  However, we may view the random stream used by this process as a part of its input.  Given the stream, we know exactly how the algorithm will execute.  When we prove the correctness of a random algorithm, we assume that the random string is drawn from a certain distribution.</p>
<p>Sometimes it&#8217;s hard to tell if something you do has an algorithmic basis.  Is how much you love someone determined algorithmically?  <a href="http://www.wolframscience.com">Some people</a> believe that the universe itself is governed by an algorithmic process.  This concept is sometimes known as <a href="http://en.wikipedia.org/wiki/Digital_physics">digital physics</a>.  In that case, love, hate, and everything under the sun is the product of an algorithm.  If this were true, I would argue that it wouldn&#8217;t detract from the universe&#8217;s beauty, richness, or importance, any more than the physical medium of a painting detracts from the painting itself.</p>
<p>Most scientists, I think, believe that the totality of the <i>rules</i> behind the universe are describable.   But it&#8217;s well known that it&#8217;s impossible for the <i>state</i> of the universe to be observed.  The <a href="http://en.wikipedia.org/wiki/Uncertainty_principle">Heisenberg uncertainty principle</a> is another example of this: you can&#8217;t know both the exact position and velocity of a particle.</p>
<p>But suppose we somehow had the whole state of the universe.  There&#8217;s still something else: the information which we get every time we observe certain quantum phenomena, such as the spin of an electron.  What if this stream were completely unknowable until after the fact?  This could very well be the case if the <a href="http://en.wikipedia.org/wiki/Many-worlds_interpretation">many-worlds interpretation</a> is correct.  Essentially, every time the universe needs a &#8220;random&#8221; bit, it splits into two universes; which universe you perceive yourself in is completely arbitrary.  This means that even if the rules behind the universe are fixed and even if all possible information is revealed to you, its behavior is not predictable, not even in a statistical sense.  Can we still call it an algorithm?  </p>
<p>At this point, it all becomes a little too philosophical for me to bother with.  There are too many interesting, concrete algorithms out there for me to spend much time on this topic.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.algoblog.com/2007/05/30/what-is-an-algorithm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ask&#8217;s algorithm</title>
		<link>http://www.algoblog.com/2007/05/29/asks-algorithm/</link>
		<comments>http://www.algoblog.com/2007/05/29/asks-algorithm/#comments</comments>
		<pubDate>Wed, 30 May 2007 03:30:46 +0000</pubDate>
		<dc:creator>Algo Blog</dc:creator>
		
		<category><![CDATA[pop]]></category>

		<guid isPermaLink="false">http://www.algoblog.com/2007/05/29/asks-algorithm/</guid>
		<description><![CDATA[Ask.com has recently launched an ad campaign centered around &#8220;the algorithm&#8221;.  They are obliquely referring to their search algorithm &#8220;Teoma&#8221; when they say &#8220;The algorithm is from Jersey&#8221;. They even ran a full-page ad in various major newspapers written in the style of an academic article.  The ad is reproduced at thealgorithm.com.  [...]]]></description>
			<content:encoded><![CDATA[<p>Ask.com has recently launched an <a href="http://blog.ask.com/2007/05/the_algorithm_i.html">ad campaign</a> centered around <a href="http://www.thealgorithm.com/">&#8220;the algorithm&#8221;</a>.  They are obliquely referring to their search algorithm <a href="http://en.wikipedia.org/wiki/Teoma">&#8220;Teoma&#8221;</a> when they say &#8220;The algorithm is from Jersey&#8221;. They even ran a full-page ad in various major newspapers written in the style of an academic article.  The ad is reproduced at <a href="http://www.thealgorithm.com/">thealgorithm.com</a>.  The only fact I could glean from it was that they use something resembling <a href="http://en.wikipedia.org/wiki/HITS_algorithm">HITS</a> in that they give each page a hub and authority value.  This is reflected in the Wikipedia entry for Teoma, which states that it was inspired by IBM&#8217;s &#8220;CLEVER&#8221; search engine, which in turn used Kleinberg&#8217;s HITS algorithm.  Other than that, it&#8217;s all marketing fluff designed to make Ask&#8217;s core technology seem complicated and cool, despite the fact that it apparently hasn&#8217;t changed for a decade.  (Of course, the proof of Fermat&#8217;s last theorem is older than that, and it&#8217;s about as complicated as things get around here.)</p>
<p>I view this campaign as being kind of like how Starbucks is to coffee.  Small coffeehouses love to bash Starbucks.  However, Starbucks has raised the awareness of coffee as a gourmet beverage and the small coffeehouses profit because of it.  So, I am glad that Ask has raised people&#8217;s awareness of algorithms.  Maybe it will make me seem more valuable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.algoblog.com/2007/05/29/asks-algorithm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Introduction</title>
		<link>http://www.algoblog.com/2007/05/29/introduction/</link>
		<comments>http://www.algoblog.com/2007/05/29/introduction/#comments</comments>
		<pubDate>Wed, 30 May 2007 02:47:59 +0000</pubDate>
		<dc:creator>Algo Blog</dc:creator>
		
		<category><![CDATA[intro]]></category>

		<guid isPermaLink="false">http://www.algoblog.com/?p=3</guid>
		<description><![CDATA[Howdy.  This is my blog about algorithms.
Posts will fall into the following categories:

Algorithms assigned as homework problems.  These will be tagged as &#8216;edu&#8217;.  I welcome submissions via email.  I will always follow these guidelines:

I will only post about problems accessible from the &#8220;general web&#8221;, by which I mean that Google can [...]]]></description>
			<content:encoded><![CDATA[<p>Howdy.  This is my blog about algorithms.</p>
<p>Posts will fall into the following categories:</p>
<ol>
<li>Algorithms assigned as homework problems.  These will be tagged as &#8216;edu&#8217;.  I welcome <a href="about/">submissions via email</a>.  I will always follow these guidelines:
<ul>
<li>I will only post about problems accessible from the &#8220;general web&#8221;, by which I mean that Google can find it.</li>
<li>I will only post about problems which were due at least a month ago.  This should cover extensions.</li>
<li>I will always paraphrase the problem (or maybe even rewrite it as an equivalent problem) and I won&#8217;t link back to any source.  This makes searching more difficult and allows the problem to be reused.</li>
<li>If you are a teacher and don&#8217;t want me to use your problems, please email me.  You will have to give me a convincing reason to delete existing posts.</li>
</ul>
</li>
<li>Fairly recent results in algorithms.  These will be tagged as &#8216;new&#8217;.</li>
<li>Classic algorithms, tagged as &#8216;classic&#8217;.</li>
<li>Algorithms as mentioned in popular culture or the media.  These will be tagged as &#8216;pop&#8217;.</li>
<li>Philosophical stuff, &#8216;philosophy&#8217;</li>
<li>My own personal ideas, &#8216;idea&#8217;.</li>
</ol>
<p>I&#8217;ll add to this as I see fit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.algoblog.com/2007/05/29/introduction/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
