From 1eb0932d04ce966cc034259f97334c53ec49af22 Mon Sep 17 00:00:00 2001 From: Jason Davies Date: Mon, 9 May 2011 09:05:44 +0100 Subject: [PATCH] Simplify binary search. --- d3.layout.js | 15 +++------------ d3.layout.min.js | 2 +- src/layout/histogram.js | 15 +++------------ 3 files changed, 7 insertions(+), 25 deletions(-) diff --git a/d3.layout.js b/d3.layout.js index 05f1dbe386e60..19ac40472f5b0 100644 --- a/d3.layout.js +++ b/d3.layout.js @@ -818,8 +818,7 @@ d3.layout.histogram = function() { // Count the number of samples per bin. for (var i = 0; i < x.length; i++) { - var j = d3_layout_histogramSearchIndex(ticks, x[i]) - 1, - bin = bins[Math.max(0, Math.min(bins.length - 1, j))]; + var bin = bins[d3_layout_histogramSearch(ticks, x[i])]; bin.y++; bin.push(data[i]); } @@ -854,23 +853,15 @@ d3.layout.histogram = function() { }; // Performs a binary search on a sorted array. -// Returns the index of the value if found, otherwise -(insertion point) - 1. -// The insertion point is the index at which value should be inserted into the -// array for the array to remain sorted. function d3_layout_histogramSearch(array, value) { - var low = 0, high = array.length - 1; + var low = 1, high = array.length - 2; while (low <= high) { var mid = (low + high) >> 1, midValue = array[mid]; if (midValue < value) low = mid + 1; else if (midValue > value) high = mid - 1; else return mid; } - return -low - 1; -} - -function d3_layout_histogramSearchIndex(array, value) { - var i = d3_layout_histogramSearch(array, value); - return (i < 0) ? (-i - 1) : i; + return low - 1; } function d3_layout_histogramTicks(x) { diff --git a/d3.layout.min.js b/d3.layout.min.js index d3a378be3c7c5..502518bacc825 100644 --- a/d3.layout.min.js +++ b/d3.layout.min.js @@ -1 +1 @@ -(function(){function V(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function U(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function T(a){var b=0,c=0,d=a.children,e=d.length,f;while(--e>=0)f=d[e]._tree,f.prelim+=b,f.mod+=b,b+=f.shift+(c+=f.change)}function S(a,b){function c(a,d){var e=a.children;if(e){var f,g=null,h=-1,i=e.length;while(++h0&&(a=d)}return a}function N(a){return a.children?a.children[a.children.length-1]:a._tree.thread}function M(a){return a.children?a.children[0]:a._tree.thread}function L(a,b){return a.parent==b.parent?1:2}function K(a){return d3.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function J(a){var b=a.children;return b?J(b[b.length-1]):a}function I(a){var b=a.children;return b?I(b[0]):a}function H(a){return a.reduce(function(a,b){return a+b.x},0)/a.length}function G(a){return 1+d3.max(a,function(a){return a.y})}function F(a,b,c){var d=b.r+c.r,e=a.r+c.r,f=b.x-a.x,g=b.y-a.y,h=Math.sqrt(f*f+g*g),i=(e*e+h*h-d*d)/(2*e*h),j=Math.acos(i),k=i*e,l=Math.sin(j)*e;f/=h,g/=h,c.x=a.x+k*f+l*g,c.y=a.y+k*g-l*f}function E(a,b,c,d){var e=a.children;a.x=b+=d*a.x,a.y=c+=d*a.y,a.r*=d;if(e){var f=-1,g=e.length;while(++f1){h=a[1],h.x=h.r,h.y=0,l(h);if(f>2){i=a[2],F(g,h,i),l(i),x(g,i),g._pack_prev=i,x(i,h),h=g._pack_next;for(var m=3;m0?(y(g,j),h=j,m--):(y(j,h),g=j,m--)}}}var q=(b+c)/2,r=(d+e)/2,s=0;for(var m=0;m.001}function y(a,b){a._pack_next=b,b._pack_prev=a}function x(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function w(a,b){return a.value-b.value}function v(a,b){return b.value-a.value}function u(a){return a.value}function t(a){return a.children}function s(a){return d3.scale.linear().domain(a).ticks(10)}function r(a,b){var c=q(a,b);return c<0?-c-1:c}function q(a,b){var c=0,d=a.length-1;while(c<=d){var e=c+d>>1,f=a[e];if(fb)d=e-1;else return e}return-c-1}function p(a,b){return a+b.y}function o(a){var b=1,c=0,d=a[0].y,e,f=a.length;for(;bd&&(c=b,d=e);return c}function n(a){return a.reduce(p,0)}function k(a){var b=0,c=0;a.count=0,a.leaf||a.nodes.forEach(function(d){k(d),a.count+=d.count,b+=d.count*d.cx,c+=d.count*d.cy}),a.point&&(a.leaf||(a.point.x+=Math.random()-.5,a.point.y+=Math.random()-.5),a.count++,b+=a.point.x,c+=a.point.y),a.cx=b/a.count,a.cy=c/a.count}function j(){d3.event.stopPropagation(),d3.event.preventDefault()}function i(){c&&(j(),c=!1)}function h(c,d){(a=c).fixed=!0,b=!1,e=this,j()}function g(b){b!==a&&(b.fixed=!1)}function f(a){a.fixed=!0}d3.layout={},d3.layout.chord=function(){function k(){b.sort(function(a,b){a=Math.min(a.source.value,a.target.value),b=Math.min(b.source.value,b.target.value);return i(a,b)})}function j(){var a={},j=[],l=d3.range(e),m=[],n,o,p,q,r;b=[],c=[],n=0,q=-1;while(++qf&&(f=i),e.push(i)}for(h=0,g=b[0];h0&&(U(V(g,a,d),a,m),i+=m,j+=m),k+=g._tree.mod,i+=e._tree.mod,l+=h._tree.mod,j+=f._tree.mod;g&&!N(f)&&(f._tree.thread=g,f._tree.mod+=k-j),e&&!M(h)&&(h._tree.thread=e,h._tree.mod+=i-l,d=a)}return d}function i(a,b){a.x=a._tree.prelim+b;var c=a.children;if(c){var d=-1,e=c.length;b+=a._tree.mod;while(++dd.dy)j=d.dy;while(++fd.dx)j=d.dx;while(++fe&&(e=d);c*=c,b*=b;return Math.max(b*e/c,c/(b*f))}function h(a){if(!!a.children){var b={x:a.x,y:a.y,dx:a.dx,dy:a.dy},c=a.children.slice(),d,e=[];e.area=0;while(d=c.pop())e.push(d),e.area+=d.area,d.z!=null&&(j(e,d.z?b.dx:b.dy,b,!c.length),e.length=e.area=0);a.children.forEach(h)}}function g(a){if(!!a.children){var b={x:a.x,y:a.y,dx:a.dx,dy:a.dy},c=[],d=a.children.slice(),e,f=Infinity,h,k=Math.min(b.dx,b.dy),l;c.area=0;while((l=d.length)>0)c.push(e=d[l-1]),c.area+=e.area,(h=i(c,k))<=f?(d.pop(),f=h):(c.area-=c.pop().area,j(c,k,b,!1),k=Math.min(b.dx,b.dy),c.length=c.area=0,f=Infinity);c.length&&(j(c,k,b,!0),c.length=c.area=0),a.children.forEach(g)}}function f(a,b){var c=a.children;a.area=a.value*b;if(c){var d=-1,e=c.length;while(++d=0)f=d[e]._tree,f.prelim+=b,f.mod+=b,b+=f.shift+(c+=f.change)}function R(a,b){function c(a,d){var e=a.children;if(e){var f,g=null,h=-1,i=e.length;while(++h0&&(a=d)}return a}function M(a){return a.children?a.children[a.children.length-1]:a._tree.thread}function L(a){return a.children?a.children[0]:a._tree.thread}function K(a,b){return a.parent==b.parent?1:2}function J(a){return d3.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function I(a){var b=a.children;return b?I(b[b.length-1]):a}function H(a){var b=a.children;return b?H(b[0]):a}function G(a){return a.reduce(function(a,b){return a+b.x},0)/a.length}function F(a){return 1+d3.max(a,function(a){return a.y})}function E(a,b,c){var d=b.r+c.r,e=a.r+c.r,f=b.x-a.x,g=b.y-a.y,h=Math.sqrt(f*f+g*g),i=(e*e+h*h-d*d)/(2*e*h),j=Math.acos(i),k=i*e,l=Math.sin(j)*e;f/=h,g/=h,c.x=a.x+k*f+l*g,c.y=a.y+k*g-l*f}function D(a,b,c,d){var e=a.children;a.x=b+=d*a.x,a.y=c+=d*a.y,a.r*=d;if(e){var f=-1,g=e.length;while(++f1){h=a[1],h.x=h.r,h.y=0,l(h);if(f>2){i=a[2],E(g,h,i),l(i),w(g,i),g._pack_prev=i,w(i,h),h=g._pack_next;for(var m=3;m0?(x(g,j),h=j,m--):(x(j,h),g=j,m--)}}}var q=(b+c)/2,r=(d+e)/2,s=0;for(var m=0;m.001}function x(a,b){a._pack_next=b,b._pack_prev=a}function w(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function v(a,b){return a.value-b.value}function u(a,b){return b.value-a.value}function t(a){return a.value}function s(a){return a.children}function r(a){return d3.scale.linear().domain(a).ticks(10)}function q(a,b){var c=1,d=a.length-2;while(c<=d){var e=c+d>>1,f=a[e];if(fb)d=e-1;else return e}return c-1}function p(a,b){return a+b.y}function o(a){var b=1,c=0,d=a[0].y,e,f=a.length;for(;bd&&(c=b,d=e);return c}function n(a){return a.reduce(p,0)}function k(a){var b=0,c=0;a.count=0,a.leaf||a.nodes.forEach(function(d){k(d),a.count+=d.count,b+=d.count*d.cx,c+=d.count*d.cy}),a.point&&(a.leaf||(a.point.x+=Math.random()-.5,a.point.y+=Math.random()-.5),a.count++,b+=a.point.x,c+=a.point.y),a.cx=b/a.count,a.cy=c/a.count}function j(){d3.event.stopPropagation(),d3.event.preventDefault()}function i(){c&&(j(),c=!1)}function h(c,d){(a=c).fixed=!0,b=!1,e=this,j()}function g(b){b!==a&&(b.fixed=!1)}function f(a){a.fixed=!0}d3.layout={},d3.layout.chord=function(){function k(){b.sort(function(a,b){a=Math.min(a.source.value,a.target.value),b=Math.min(b.source.value,b.target.value);return i(a,b)})}function j(){var a={},j=[],l=d3.range(e),m=[],n,o,p,q,r;b=[],c=[],n=0,q=-1;while(++qf&&(f=i),e.push(i)}for(h=0,g=b[0];h0&&(T(U(g,a,d),a,m),i+=m,j+=m),k+=g._tree.mod,i+=e._tree.mod,l+=h._tree.mod,j+=f._tree.mod;g&&!M(f)&&(f._tree.thread=g,f._tree.mod+=k-j),e&&!L(h)&&(h._tree.thread=e,h._tree.mod+=i-l,d=a)}return d}function i(a,b){a.x=a._tree.prelim+b;var c=a.children;if(c){var d=-1,e=c.length;b+=a._tree.mod;while(++dd.dy)j=d.dy;while(++fd.dx)j=d.dx;while(++fe&&(e=d);c*=c,b*=b;return Math.max(b*e/c,c/(b*f))}function h(a){if(!!a.children){var b={x:a.x,y:a.y,dx:a.dx,dy:a.dy},c=a.children.slice(),d,e=[];e.area=0;while(d=c.pop())e.push(d),e.area+=d.area,d.z!=null&&(j(e,d.z?b.dx:b.dy,b,!c.length),e.length=e.area=0);a.children.forEach(h)}}function g(a){if(!!a.children){var b={x:a.x,y:a.y,dx:a.dx,dy:a.dy},c=[],d=a.children.slice(),e,f=Infinity,h,k=Math.min(b.dx,b.dy),l;c.area=0;while((l=d.length)>0)c.push(e=d[l-1]),c.area+=e.area,(h=i(c,k))<=f?(d.pop(),f=h):(c.area-=c.pop().area,j(c,k,b,!1),k=Math.min(b.dx,b.dy),c.length=c.area=0,f=Infinity);c.length&&(j(c,k,b,!0),c.length=c.area=0),a.children.forEach(g)}}function f(a,b){var c=a.children;a.area=a.value*b;if(c){var d=-1,e=c.length;while(++d> 1, midValue = array[mid]; if (midValue < value) low = mid + 1; else if (midValue > value) high = mid - 1; else return mid; } - return -low - 1; -} - -function d3_layout_histogramSearchIndex(array, value) { - var i = d3_layout_histogramSearch(array, value); - return (i < 0) ? (-i - 1) : i; + return low - 1; } function d3_layout_histogramTicks(x) {