<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>spec/kd_expected_out.txt</filename>
    </added>
    <added>
      <filename>spec/kd_test_in.txt</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -9,11 +9,14 @@
     
     First, put the points into the tree:
     
-      kd = Containers::KDTree.new([ [4, 3], [3, 4], [-1, 2], [6, 4], [3, -5], [-2, -5] ])
+      kdtree = Containers::KDTree.new( {0 =&gt; [4, 3], 1 =&gt; [3, 4], 2 =&gt; [-1, 2], 3 =&gt; [6, 4],
+                                       4 =&gt; [3, -5], 5 =&gt; [-2, -5] })
     
     Then, query on the tree:
     
-      puts kd.find_nearest([0, 0], 2) =&gt; [[0, 6], [0, 3]]
+      puts kd.find_nearest([0, 0], 2) =&gt; [[5, 2], [9, 1]]
+      
+    The result is an array of [distance, id] pairs. There seems to be a bug in this version.
       
     Note that the point queried on does not have to exist in the tree. However, if it does exist,
     it will be returned.
@@ -23,21 +26,30 @@
 class Containers::KDTree
   Node = Struct.new(:id, :coords, :left, :right)
   
+  # Points is a hash of id =&gt; [coord, coord] pairs.
   def initialize(points)
-    @root = build_tree(points)
+    raise &quot;must pass in a hash&quot; unless points.kind_of?(Hash)
+    @dimensions = points[ points.keys.first ].size
+    @root = build_tree(points.to_a)
+    @nearest = []
+  end
+  
+  # Find k closest points to given coordinates 
+  def find_nearest(target, k_nearest)
     @nearest = []
+    nearest(@root, target, k_nearest, 0)
   end
   
-  # Build a kd-tree
+  # points is an array
   def build_tree(points, depth=0)
     return if points.empty?
-  
-    axis = depth % 2
-  
-    points.sort! { |a, b| a[1][axis] &lt;=&gt; b[1][axis] }
+    
+    axis = depth % @dimensions
+    
+    points.sort! { |a, b| a.last[axis] &lt;=&gt; b.last[axis] }
     median = points.size / 2
-  
-    node = Node.new(points[median][0], points[median][1], nil, nil)
+    
+    node = Node.new(points[median].first, points[median].last, nil, nil)
     node.left = build_tree(points[0...median], depth+1)
     node.right = build_tree(points[median+1..-1], depth+1)
     node
@@ -65,14 +77,9 @@ class Containers::KDTree
   end
   private :check_nearest
   
-  # Find k closest points to given coordinates 
-  def find_nearest(target, k_nearest)
-    @nearest = []
-    nearest(@root, target, k_nearest, 0)
-  end
-    
+  # Recursively find nearest coordinates, going down the appropriate branch as needed
   def nearest(node, target, k_nearest, depth)
-    axis = depth % 2
+    axis = depth % @dimensions
   
     if node.left.nil? &amp;&amp; node.right.nil? # Leaf node
       @nearest = check_nearest(@nearest, node, target, k_nearest)</diff>
      <filename>lib/containers/kd_tree.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,34 @@
 $: &lt;&lt; File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib')
 require 'algorithms'
 
-# TODO: KD Tree Spec
+describe Containers::KDTree do
+  it &quot;should work for a documented example&quot; do
+    kdtree = Containers::KDTree.new( {0 =&gt; [4, 3], 1 =&gt; [3, 0], 2 =&gt; [-1, 2], 3 =&gt; [6, 4],
+                                     4 =&gt; [3, -5], 5 =&gt; [-2, -5] })
+    closest_2 = kdtree.find_nearest([0, 0], 2)
+    closest_2.should eql([[5, 2], [9, 1]])
+  end
+  
+  it &quot;should work for real-life example from facebook puzzle&quot; do
+    points = {}
+    input = File.open(File.join(File.dirname(__FILE__), 'kd_test_in.txt'), 'r')
+
+    # Populate points hash
+    input.each_line do |line|
+      break if line.empty?
+      n, x, y = line.split(/\s+/)
+      points[n.to_i] = [x.to_f, y.to_f]
+    end
+
+    out = &quot;&quot;
+    kdtree = Containers::KDTree.new(points)
+    points.sort{ |(k1, v1), (k2, v2)| k1 &lt;=&gt; k2 }.each { |id, point|
+      nearest_4 = kdtree.find_nearest(point, 4)
+      out &lt;&lt; &quot;#{id} #{nearest_4[1..-1].collect{ |n| n[1] }.join(',')}\n&quot;
+    }
+    
+    expected = File.read(File.join(File.dirname(__FILE__), 'kd_expected_out.txt'))
+    expected.should eql(out)
+  end
+  
+end</diff>
      <filename>spec/kd_tree_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>e26bd6a481d21f39721c2538f223459f90ae8d46</id>
    </parent>
  </parents>
  <author>
    <name>Kanwei Li</name>
    <email>kanwei@gmail.com</email>
  </author>
  <url>http://github.com/kanwei/algorithms/commit/f2db2fee5a7f13000ac1f8ff24fcaed2f7283aea</url>
  <id>f2db2fee5a7f13000ac1f8ff24fcaed2f7283aea</id>
  <committed-date>2009-08-25T23:11:06-07:00</committed-date>
  <authored-date>2009-08-25T23:11:06-07:00</authored-date>
  <message>Tests for kd-tree, it still seems semi-broken</message>
  <tree>ec06548a59ed6aabde92701d5547e7b5653494a7</tree>
  <committer>
    <name>Kanwei Li</name>
    <email>kanwei@gmail.com</email>
  </committer>
</commit>
