<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: Treaps</title>
	<atom:link href="http://programmingpraxis.com/2009/06/26/treaps/feed/" rel="self" type="application/rss+xml" />
	<link>http://programmingpraxis.com/2009/06/26/treaps/</link>
	<description>A collection of etudes, updated weekly, for the education and enjoyment of the savvy programmer</description>
	<lastBuildDate>Mon, 28 May 2012 03:30:45 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: Vikas Tandi</title>
		<link>http://programmingpraxis.com/2009/06/26/treaps/#comment-2983</link>
		<dc:creator><![CDATA[Vikas Tandi]]></dc:creator>
		<pubDate>Thu, 05 May 2011 03:34:32 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=791#comment-2983</guid>
		<description><![CDATA[My implementation in C
[sourcecode lang=&quot;cpp&quot;]
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;

typedef struct treapNode
{
	int					key;
	int					priority;
	struct	treapNode*	left;
	struct	treapNode*	right;
}treap;

static treap* sentinel;

static treap* create_node(int key);
static treap* right_rotation(treap *p);
static treap* left_rotation(treap *p);

treap* treap_init()
{
	sentinel = (treap*)malloc(sizeof(*sentinel));
	if(sentinel == NULL)
		return NULL;

	sentinel-&gt;key = 0;
	sentinel-&gt;priority = INT_MIN;
	sentinel-&gt;left = sentinel-&gt;right = NULL;
	srand((unsigned int)time(NULL));
	return sentinel;
}

treap* treap_search(treap *p, int key)
{
	if(p == sentinel)
		return NULL;
	else if(key == p-&gt;key)
		return p;
	else if(key &lt; p-&gt;key)
		return treap_search(p-&gt;left, key);
	else
		return treap_search(p-&gt;right, key);
}

treap* treap_insert(treap *p, int key)
{
	if(p == sentinel)
	{
		p = create_node(key);
		if(p == NULL)
			return NULL;
	}
	else if(key &lt; p-&gt;key)
	{
		p-&gt;left = treap_insert(p-&gt;left, key);
		if(p-&gt;priority &lt; p-&gt;left-&gt;priority)
			p = right_rotation(p);
	}
	else
	{
		p-&gt;right = treap_insert(p-&gt;right, key);
		if(p-&gt;priority &lt; p-&gt;right-&gt;priority)
			p = left_rotation(p);
	}
	return p;
}

treap* treap_remove(treap *p, int key)
{
	if(key &lt; p-&gt;key)
		p-&gt;left = treap_remove(p-&gt;left, key);
	else if(key &gt; p-&gt;key)
		p-&gt;right = treap_remove(p-&gt;right, key);
	else
	{
		if(p-&gt;left == sentinel &amp;&amp; p-&gt;right == sentinel)
		{
			free(p);
			return sentinel;
		}

		if(p-&gt;left-&gt;priority &gt; p-&gt;right-&gt;priority)
		{
			p = right_rotation(p);
			p-&gt;right = treap_remove(p-&gt;right, key);
		}
		else
		{
			p = left_rotation(p);
			p-&gt;left = treap_remove(p-&gt;left, key);
		}
	}
	return p;
}

static treap* create_node(int key)
{
	treap *p;

	p = (treap*)malloc(sizeof(*p));
	if(p == NULL)
		return NULL;

	p-&gt;priority = rand();
	p-&gt;key = key;
	p-&gt;left = p-&gt;right = sentinel;
	return p;
}

static treap* right_rotation(treap *p)
{
	treap *s;

	s = p-&gt;left;
	p-&gt;left = s-&gt;right;
	s-&gt;right = p;
	return s;
}

static treap* left_rotation(treap *p)
{
	treap *s;

	s = p-&gt;right;
	p-&gt;right = s-&gt;left;
	s-&gt;left = p;
	return s;
}
[/sourcecode]]]></description>
		<content:encoded><![CDATA[<p>My implementation in C</p>
<pre class="brush: cpp;">
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;

typedef struct treapNode
{
	int					key;
	int					priority;
	struct	treapNode*	left;
	struct	treapNode*	right;
}treap;

static treap* sentinel;

static treap* create_node(int key);
static treap* right_rotation(treap *p);
static treap* left_rotation(treap *p);

treap* treap_init()
{
	sentinel = (treap*)malloc(sizeof(*sentinel));
	if(sentinel == NULL)
		return NULL;

	sentinel-&gt;key = 0;
	sentinel-&gt;priority = INT_MIN;
	sentinel-&gt;left = sentinel-&gt;right = NULL;
	srand((unsigned int)time(NULL));
	return sentinel;
}

treap* treap_search(treap *p, int key)
{
	if(p == sentinel)
		return NULL;
	else if(key == p-&gt;key)
		return p;
	else if(key &lt; p-&gt;key)
		return treap_search(p-&gt;left, key);
	else
		return treap_search(p-&gt;right, key);
}

treap* treap_insert(treap *p, int key)
{
	if(p == sentinel)
	{
		p = create_node(key);
		if(p == NULL)
			return NULL;
	}
	else if(key &lt; p-&gt;key)
	{
		p-&gt;left = treap_insert(p-&gt;left, key);
		if(p-&gt;priority &lt; p-&gt;left-&gt;priority)
			p = right_rotation(p);
	}
	else
	{
		p-&gt;right = treap_insert(p-&gt;right, key);
		if(p-&gt;priority &lt; p-&gt;right-&gt;priority)
			p = left_rotation(p);
	}
	return p;
}

treap* treap_remove(treap *p, int key)
{
	if(key &lt; p-&gt;key)
		p-&gt;left = treap_remove(p-&gt;left, key);
	else if(key &gt; p-&gt;key)
		p-&gt;right = treap_remove(p-&gt;right, key);
	else
	{
		if(p-&gt;left == sentinel &amp;&amp; p-&gt;right == sentinel)
		{
			free(p);
			return sentinel;
		}

		if(p-&gt;left-&gt;priority &gt; p-&gt;right-&gt;priority)
		{
			p = right_rotation(p);
			p-&gt;right = treap_remove(p-&gt;right, key);
		}
		else
		{
			p = left_rotation(p);
			p-&gt;left = treap_remove(p-&gt;left, key);
		}
	}
	return p;
}

static treap* create_node(int key)
{
	treap *p;

	p = (treap*)malloc(sizeof(*p));
	if(p == NULL)
		return NULL;

	p-&gt;priority = rand();
	p-&gt;key = key;
	p-&gt;left = p-&gt;right = sentinel;
	return p;
}

static treap* right_rotation(treap *p)
{
	treap *s;

	s = p-&gt;left;
	p-&gt;left = s-&gt;right;
	s-&gt;right = p;
	return s;
}

static treap* left_rotation(treap *p)
{
	treap *s;

	s = p-&gt;right;
	p-&gt;right = s-&gt;left;
	s-&gt;left = p;
	return s;
}
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Scott Pedersen</title>
		<link>http://programmingpraxis.com/2009/06/26/treaps/#comment-352</link>
		<dc:creator><![CDATA[Scott Pedersen]]></dc:creator>
		<pubDate>Thu, 16 Jul 2009 01:38:31 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=791#comment-352</guid>
		<description><![CDATA[Finally finished.  It took me a while to get everything working since I went all out and implemented the full IDictionary interface.  It was fun to get all of the code to work properly, but there&#039;s clearly some optimization work needed to make the thing useful.  My implementation&#039;s performance compares unfavorably to the .Net framework&#039;s built in System.Collections.Generic.Dictionary in all of my tests.  

http://inscrutable.pastebin.com/f3fabfc9a]]></description>
		<content:encoded><![CDATA[<p>Finally finished.  It took me a while to get everything working since I went all out and implemented the full IDictionary interface.  It was fun to get all of the code to work properly, but there&#8217;s clearly some optimization work needed to make the thing useful.  My implementation&#8217;s performance compares unfavorably to the .Net framework&#8217;s built in System.Collections.Generic.Dictionary in all of my tests.  </p>
<p><a href="http://inscrutable.pastebin.com/f3fabfc9a" rel="nofollow">http://inscrutable.pastebin.com/f3fabfc9a</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: veer</title>
		<link>http://programmingpraxis.com/2009/06/26/treaps/#comment-240</link>
		<dc:creator><![CDATA[veer]]></dc:creator>
		<pubDate>Sat, 27 Jun 2009 17:24:29 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=791#comment-240</guid>
		<description><![CDATA[Attempt in clojure , using pseudocode from http://sims.berkeley.edu/~aragon/pubs/rst96.pdf

pastebin link http://clojure.pastebin.com/f20e92d3a

[sourcecode lang=&#039;css&#039;] 
(defstruct treaps :key :prio :value :left :right)

(defn less? [a b] (neg? (compare a b)))
(defn greater? [a b] (pos? (compare a b)))
(defn eql? [a b] (zero? (compare a b)))

(defn insert [k p v treap]
  (cond
    (nil? treap) (struct-map treaps :key k :prio p :value v)
    (less? k (:key treap))
    (let [tr (assoc treap :left (insert k p v (:left treap)))]
      (if (&gt; (:prio (:left tr)) (:prio tr)) (rotate-right tr) tr))
    (greater? k (:key treap))
    (let [tr (assoc treap :right (insert k p v (:right treap)))]
      (if (&gt; (:prio (:right tr)) (:prio tr)) (rotate-left tr) tr))
    :else  treap))


(defn delete [k treap]
  (cond
    (nil? treap) nil
    (less? k (:key treap)) (assoc treap :left (delete k (:left treap)))
    (greater? k (:key treap)) (assoc treap :right (delete k (:right treap)))
    :else (root-delete treap)))

(defn root-delete [treap]  
  (cond    
    (and (nil? (:left treap)) (nil? (:right treap))) nil
    (nil? (:left treap)) (:right  treap)
    (nil? (:right treap)) (:left  treap)
    :else (if (&gt; (:prio (:left treap)) (:prio (:right treap))) 
	    (let [tr (rotate-right treap)]
	      (assoc tr :right (root-delete (:right tr))))
	    (let [tr (rotate-left treap)]
	      (assoc tr :left (root-delete (:left tr)))))))


(defn look-up [k treap]
  (cond
    (nil? treap) nil
    (less? k (:key treap)) (look-up k (:left treap))
    (greater? k (:key treap)) (look-up k (:right treap))
    :else (:value treap)))


(defn enlist [treap]
  (if (nil? treap) &#039;()
      (concat (enlist (:left treap)) 
	      (list (str (:key treap)) (:prio treap)) 
	      (enlist (:right treap)))))


(defn update [k v treap]
  (cond
    (nil? treap) nil
    (less? k (:key treap)) (assoc treap :left (update k v (:left treap)))
    (greater? k (:key treap)) (assoc treap :right (update k v (:right treap)))
    :else (assoc treap :value v)))

      			    
(defn rotate-right [a-tree]
  (assoc (:left a-tree) :right (assoc a-tree :left (:right (:left a-tree)))))
   
(defn rotate-left [a-tree]
  (assoc (:right a-tree) :left (assoc a-tree :right (:left (:right a-tree)))))


(def lst &#039;((80 \v) (60 \g) (63 \z) (37 \a) (57 \s) (47 \x)
	   (31 \d) (53 \k) (39 \u) (22 \w) (36 \y)
	   (15 \j) (48 \p) (21 \t) (17 \m) (34 \q) ))

(def tree (reduce 
	   (fn [a b] (insert (second b) (first b) (first b) a)) nil lst))

(def tree2 (reduce 
	   (fn [a b] (insert (second b) (rand) (first b) a)) nil lst))

(= (delete \l (insert \l 69 69 tree)) tree)
(= (delete \l (insert \l (rand) &quot;L&quot; tree2)) tree2)

[/sourcecode]]]></description>
		<content:encoded><![CDATA[<p>Attempt in clojure , using pseudocode from <a href="http://sims.berkeley.edu/~aragon/pubs/rst96.pdf" rel="nofollow">http://sims.berkeley.edu/~aragon/pubs/rst96.pdf</a></p>
<p>pastebin link <a href="http://clojure.pastebin.com/f20e92d3a" rel="nofollow">http://clojure.pastebin.com/f20e92d3a</a></p>
<pre class="brush: css;"> 
(defstruct treaps :key :prio :value :left :right)

(defn less? [a b] (neg? (compare a b)))
(defn greater? [a b] (pos? (compare a b)))
(defn eql? [a b] (zero? (compare a b)))

(defn insert [k p v treap]
  (cond
    (nil? treap) (struct-map treaps :key k :prio p :value v)
    (less? k (:key treap))
    (let [tr (assoc treap :left (insert k p v (:left treap)))]
      (if (&gt; (:prio (:left tr)) (:prio tr)) (rotate-right tr) tr))
    (greater? k (:key treap))
    (let [tr (assoc treap :right (insert k p v (:right treap)))]
      (if (&gt; (:prio (:right tr)) (:prio tr)) (rotate-left tr) tr))
    :else  treap))


(defn delete [k treap]
  (cond
    (nil? treap) nil
    (less? k (:key treap)) (assoc treap :left (delete k (:left treap)))
    (greater? k (:key treap)) (assoc treap :right (delete k (:right treap)))
    :else (root-delete treap)))

(defn root-delete [treap]  
  (cond    
    (and (nil? (:left treap)) (nil? (:right treap))) nil
    (nil? (:left treap)) (:right  treap)
    (nil? (:right treap)) (:left  treap)
    :else (if (&gt; (:prio (:left treap)) (:prio (:right treap))) 
	    (let [tr (rotate-right treap)]
	      (assoc tr :right (root-delete (:right tr))))
	    (let [tr (rotate-left treap)]
	      (assoc tr :left (root-delete (:left tr)))))))


(defn look-up [k treap]
  (cond
    (nil? treap) nil
    (less? k (:key treap)) (look-up k (:left treap))
    (greater? k (:key treap)) (look-up k (:right treap))
    :else (:value treap)))


(defn enlist [treap]
  (if (nil? treap) '()
      (concat (enlist (:left treap)) 
	      (list (str (:key treap)) (:prio treap)) 
	      (enlist (:right treap)))))


(defn update [k v treap]
  (cond
    (nil? treap) nil
    (less? k (:key treap)) (assoc treap :left (update k v (:left treap)))
    (greater? k (:key treap)) (assoc treap :right (update k v (:right treap)))
    :else (assoc treap :value v)))

      			    
(defn rotate-right [a-tree]
  (assoc (:left a-tree) :right (assoc a-tree :left (:right (:left a-tree)))))
   
(defn rotate-left [a-tree]
  (assoc (:right a-tree) :left (assoc a-tree :right (:left (:right a-tree)))))


(def lst '((80 \v) (60 \g) (63 \z) (37 \a) (57 \s) (47 \x)
	   (31 \d) (53 \k) (39 \u) (22 \w) (36 \y)
	   (15 \j) (48 \p) (21 \t) (17 \m) (34 \q) ))

(def tree (reduce 
	   (fn [a b] (insert (second b) (first b) (first b) a)) nil lst))

(def tree2 (reduce 
	   (fn [a b] (insert (second b) (rand) (first b) a)) nil lst))

(= (delete \l (insert \l 69 69 tree)) tree)
(= (delete \l (insert \l (rand) &quot;L&quot; tree2)) tree2)

</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Remco Niemeijer</title>
		<link>http://programmingpraxis.com/2009/06/26/treaps/#comment-228</link>
		<dc:creator><![CDATA[Remco Niemeijer]]></dc:creator>
		<pubDate>Fri, 26 Jun 2009 18:11:21 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=791#comment-228</guid>
		<description><![CDATA[My Haskell solution (see http://bonsaicode.wordpress.com/2009/06/26/programming-praxis-treaps/ for a version with comments):

[sourcecode lang=&#039;css&#039;]
import Control.Monad
import Data.Char
import qualified Data.List.Key as K
import System.Random

data Treap k a = Nil &#124; Node Int k a (Treap k a) (Treap k a)

priority :: Treap k a -&gt; Int
priority Nil = -1
priority (Node p _ _ _ _) = p

rotLeft :: Treap k a -&gt; Treap k a
rotLeft (Node p k a l (Node rp rk ra rl rr)) =
    Node rp rk ra (Node p k a l rl) rr
rotLeft t = t

rotRight :: Treap k a -&gt; Treap k a
rotRight (Node p k a (Node lp lk la ll lr) r) =
    Node lp lk la ll (Node p k a lr r)
rotRight t = t

rot :: Treap k a -&gt; Treap k a
rot Nil = Nil
rot t@(Node p _ _ l r) &#124; p &lt; priority l = rotRight t
                       &#124; p &lt; priority r = rotLeft t
                       &#124; otherwise      = t

find :: Ord k =&gt; k -&gt; Treap k a -&gt; Maybe a
find _  Nil = Nothing
find k&#039; (Node _ k a l r) &#124; k&#039; &lt; k    = find k&#039; l
                         &#124; k&#039; &gt; k    = find k&#039; r
                         &#124; otherwise = Just a

update :: Ord k =&gt; (a -&gt; a -&gt; a) -&gt; k -&gt; a -&gt; Treap k a -&gt; IO (Treap k a)
update _ k&#039; a&#039; Nil = fmap (\r -&gt; Node r k&#039; a&#039; Nil Nil) $
                     randomRIO (0, maxBound)
update f k&#039; a&#039; (Node p k a l r)
    &#124; k&#039; &lt; k    = fmap (\n -&gt; rot $ Node p k a n r) (update f k&#039; a&#039; l)
    &#124; k&#039; &gt; k    = fmap (rot . Node p k a l) (update f k&#039; a&#039; r)
    &#124; otherwise = return $ Node p k&#039; (f a&#039; a) l r

insert :: Ord k =&gt; k -&gt; a -&gt; Treap k a -&gt; IO (Treap k a)
insert = update const

deroot :: Treap k a -&gt; Treap k a
deroot Nil = Nil
deroot t@(Node _ _ _ l r)
    &#124; priority l &lt; priority r = d deroot id $ rotLeft t
    &#124; otherwise               = d id deroot $ rotRight t
    where d fl fr = (\(Node p k a l&#039; r&#039;) -&gt; Node p k a (fl l&#039;) (fr r&#039;))

delete :: Ord k =&gt; k -&gt; Treap k a -&gt; Treap k a
delete _ Nil = Nil
delete k&#039; t@(Node p k a l r)
    &#124; k&#039; &lt; k    = Node p k a (delete k&#039; l) r
    &#124; k&#039; &gt; k    = Node p k a l (delete k&#039; r)
    &#124; otherwise = deroot t

toList :: Treap k a -&gt; [(k, a)]
toList Nil = []
toList (Node _ k a l r) = toList l ++ [(k, a)] ++ toList r

main :: IO ()
main = mapM_ print =&lt;&lt; wordFreqs 25 =&lt;&lt; readFile &quot;bible.txt&quot;

wordFreqs :: Int -&gt; String -&gt; IO [(String, Int)]
wordFreqs n = fmap (take n . reverse . K.sort snd . toList) .
              foldM (\a w -&gt; update (+) w 1 a) Nil .
              map (filter isAlpha) . words
[/sourcecode]]]></description>
		<content:encoded><![CDATA[<p>My Haskell solution (see <a href="http://bonsaicode.wordpress.com/2009/06/26/programming-praxis-treaps/" rel="nofollow">http://bonsaicode.wordpress.com/2009/06/26/programming-praxis-treaps/</a> for a version with comments):</p>
<pre class="brush: css;">
import Control.Monad
import Data.Char
import qualified Data.List.Key as K
import System.Random

data Treap k a = Nil | Node Int k a (Treap k a) (Treap k a)

priority :: Treap k a -&gt; Int
priority Nil = -1
priority (Node p _ _ _ _) = p

rotLeft :: Treap k a -&gt; Treap k a
rotLeft (Node p k a l (Node rp rk ra rl rr)) =
    Node rp rk ra (Node p k a l rl) rr
rotLeft t = t

rotRight :: Treap k a -&gt; Treap k a
rotRight (Node p k a (Node lp lk la ll lr) r) =
    Node lp lk la ll (Node p k a lr r)
rotRight t = t

rot :: Treap k a -&gt; Treap k a
rot Nil = Nil
rot t@(Node p _ _ l r) | p &lt; priority l = rotRight t
                       | p &lt; priority r = rotLeft t
                       | otherwise      = t

find :: Ord k =&gt; k -&gt; Treap k a -&gt; Maybe a
find _  Nil = Nothing
find k' (Node _ k a l r) | k' &lt; k    = find k' l
                         | k' &gt; k    = find k' r
                         | otherwise = Just a

update :: Ord k =&gt; (a -&gt; a -&gt; a) -&gt; k -&gt; a -&gt; Treap k a -&gt; IO (Treap k a)
update _ k' a' Nil = fmap (\r -&gt; Node r k' a' Nil Nil) $
                     randomRIO (0, maxBound)
update f k' a' (Node p k a l r)
    | k' &lt; k    = fmap (\n -&gt; rot $ Node p k a n r) (update f k' a' l)
    | k' &gt; k    = fmap (rot . Node p k a l) (update f k' a' r)
    | otherwise = return $ Node p k' (f a' a) l r

insert :: Ord k =&gt; k -&gt; a -&gt; Treap k a -&gt; IO (Treap k a)
insert = update const

deroot :: Treap k a -&gt; Treap k a
deroot Nil = Nil
deroot t@(Node _ _ _ l r)
    | priority l &lt; priority r = d deroot id $ rotLeft t
    | otherwise               = d id deroot $ rotRight t
    where d fl fr = (\(Node p k a l' r') -&gt; Node p k a (fl l') (fr r'))

delete :: Ord k =&gt; k -&gt; Treap k a -&gt; Treap k a
delete _ Nil = Nil
delete k' t@(Node p k a l r)
    | k' &lt; k    = Node p k a (delete k' l) r
    | k' &gt; k    = Node p k a l (delete k' r)
    | otherwise = deroot t

toList :: Treap k a -&gt; [(k, a)]
toList Nil = []
toList (Node _ k a l r) = toList l ++ [(k, a)] ++ toList r

main :: IO ()
main = mapM_ print =&lt;&lt; wordFreqs 25 =&lt;&lt; readFile &quot;bible.txt&quot;

wordFreqs :: Int -&gt; String -&gt; IO [(String, Int)]
wordFreqs n = fmap (take n . reverse . K.sort snd . toList) .
              foldM (\a w -&gt; update (+) w 1 a) Nil .
              map (filter isAlpha) . words
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Programming Praxis &#8211; Treaps &#171; Bonsai Code</title>
		<link>http://programmingpraxis.com/2009/06/26/treaps/#comment-227</link>
		<dc:creator><![CDATA[Programming Praxis &#8211; Treaps &#171; Bonsai Code]]></dc:creator>
		<pubDate>Fri, 26 Jun 2009 18:10:57 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=791#comment-227</guid>
		<description><![CDATA[[...] Praxis &#8211;&#160;Treaps By Remco Niemeijer  Today’s Programming Praxis problem is about Treaps – binary trees that are more or less balanced thanks [...]]]></description>
		<content:encoded><![CDATA[<p>[...] Praxis &#8211;&nbsp;Treaps By Remco Niemeijer  Today’s Programming Praxis problem is about Treaps – binary trees that are more or less balanced thanks [...]</p>
]]></content:encoded>
	</item>
</channel>
</rss>

