Skip to content

Commit beda71b

Browse files
committed
add binarytree
1 parent 784b63a commit beda71b

File tree

4 files changed

+67
-4
lines changed

4 files changed

+67
-4
lines changed

ktree.mjs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,26 @@ if (!Array.prototype.flatMap) {
88
// carterian products
99
export const cart = (...args) => args.reduce((xs, a) => xs.flatMap(xsi => a.map(ai => [...xsi, ai])), [[]]);
1010

11+
const dist1 = (c1, c2) => (c1[0] - c2[0]) ** 2;
1112
const dist2 = (c1, c2) => (c1[0] - c2[0]) ** 2 + (c1[1] - c2[1]) ** 2;
1213
const dist3 = (c1, c2) => (c1[0] - c2[0]) ** 2 + (c1[1] - c2[1]) ** 2 + (c1[2] - c2[2]) ** 2;
1314
const distk = (c1, c2) => c1.map((_, i) => (c1[i] - c2[i]) ** 2).reduce((a, b) => a + b);
1415

16+
const eq1 = (c1, c2) => c1[0] === c2[0];
1517
const eq2 = (c1, c2) => c1[0] === c2[0] && c1[1] === c2[1];
1618
const eq3 = (c1, c2) => c1[0] === c2[0] && c1[1] === c2[1] && c1[2] === c2[2];
1719
const eqk = (c1, c2) => c1.every((_, i) => c1[i] && c2[i]);
1820

21+
const buildTree1 = (depth, n = 0) =>
22+
n >= depth
23+
? { n, items: [] }
24+
: {
25+
n,
26+
items: [],
27+
'0': buildTree1(depth, n + 1),
28+
'1': buildTree1(depth, n + 1),
29+
};
30+
1931
const buildTree2 = (depth, n = 0) =>
2032
n >= depth
2133
? { n, items: [] }
@@ -56,7 +68,20 @@ export const ktree = k => {
5668

5769
let buildTree;
5870
let getNeighbors;
59-
if (k === 2) {
71+
if (k === 1) {
72+
buildTree = buildTree1;
73+
getNeighbors = ([x], N) => {
74+
const nodes = [];
75+
for (let i = 0; i < NS.length; i++) {
76+
const X = x + NS[i][0];
77+
if (X >= 0 && X < N) {
78+
nodes.push([X]);
79+
}
80+
}
81+
return nodes;
82+
};
83+
}
84+
else if (k === 2) {
6085
buildTree = buildTree2
6186
getNeighbors = ([x, y], N) => {
6287
const nodes = [];
@@ -106,8 +131,8 @@ export const ktree = k => {
106131
};
107132
}
108133

109-
const eq = k === 2 ? eq2 : k === 3 ? eq3 : eqk;
110-
const dist = k === 2 ? dist2 : k === 3 ? dist3 : distk;
134+
const eq = k === 2 ? eq2 : k === 3 ? eq3 : k === 1 ? eq1 : eqk;
135+
const dist = k === 2 ? dist2 : k === 3 ? dist3 : k === 1 ? dist1 : distk;
111136

112137
return class KTree {
113138
constructor(items = [], { length = 8, depth = 4, key = 'coords', transform = x => x } = {}) {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ktree",
3-
"version": "3.1.0",
3+
"version": "3.1.1",
44
"description": "Efficient tree search in k-dimensions",
55
"main": "dist/ktree.cjs.js",
66
"browser": "dist/ktree.umd.js",

test/binarytree.spec.mjs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import assert from 'assert';
2+
import { ktree } from '../ktree';
3+
4+
const Binarytree = ktree(1);
5+
6+
const tf = x => [parseInt(x, 16)];
7+
8+
const data = [ // distance to 36
9+
'12',
10+
'39',
11+
'58'
12+
];
13+
14+
const t = new Binarytree(
15+
data.map(x => ({ name: x })),
16+
{ key: 'name', transform: tf, depth: 1 }
17+
);
18+
19+
const results = [];
20+
21+
for (; ;) {
22+
const item = t.closest('36');
23+
24+
if (!item) break;
25+
26+
results.push(item);
27+
28+
t.remove(item.name);
29+
}
30+
31+
assert.deepEqual(results, [
32+
{ name: '39', d: 3 },
33+
{ name: '58', d: 34 },
34+
{ name: '12', d: 36 }
35+
]);
36+
37+
assert.equal(JSON.stringify(t), `{"items":"","cs":{}}`);

test/index.spec.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import './binarytree.spec';
12
import './quadtree.spec';
23
import './octree.spec';
34
import './hextree.spec';

0 commit comments

Comments
 (0)