Tag: algorithm

最小化canvas“位图”数据大小

上下文:多用户应用程序(node.js) – 1个画家,n个客户 帆布尺寸: 650×400像素(= 260,000像素) 为了更频繁地更新canvas(我每秒思考10次),我需要保持尽可能小的数据大小,特别是在考虑上传速率时。 返回一个base64string的toDataURL()方法很好,但它包含了大量我不需要的数据(每像素23位)。 它的长度是8,088(没有前面的MIME信息),假设JavaScriptstring有8位编码,即8.1千字节的数据,每秒10次。 我接下来的尝试是使用JS对象来处理moveTo(x, y)或lineTo(x, y)等不同的上下文动作,并将它们发送到服务器,让客户端通过delta更新(通过时间戳)接收数据。 但是,结果是比base64string效率更低。 { "timestamp": 0, "what": { "name": LINE_TO, "args": {"x": x, "y": y} } } 它并不stream畅,也不准确,因为当你刷你的画笔时已经有近300条lineTo命令了。 有时会有一部分运动缺失(使一条直线而不是四舍五入),有时事件甚至不能被脚本客户端识别,因为它似乎已经被已经触发的大量事件“淹没”了。 所以我必须最终使用8.1 KB的base64string。 我不想担心这一点 – 但即使与增量更新asynchronous完成,实际服务器上也会出现严重滞后,更不用说偶尔带宽超限。 我使用的唯一颜色是#000和#FFF,所以我只考虑一个1位的数据结构 ,只使用增量更新。 这基本上就足够了,我不介意任何“颜色”的精度损失(毕竟是黑色的 )。 大部分的canvas都是白色的,你可以考虑额外的霍夫曼游程编码来进一步减小尺寸。 像一个尺寸为50×2像素的canvas,在(26,2)处的单个黑色像素将返回以下string: 75W1B74W (50 + 25白色像素,然后是1黑色像素,然后是24白色像素) 如果canvas由如下的1位string组成,那甚至会有所帮助: 00000000000000000000000000000000000000000000000000 00000000000000000000000001000000000000000000000000 这将有助于很多。 我的第一个问题是:如何编写一个algorithm来有效地获取这些数据? 第二个是:我怎样才能将纯二进制canvas数据传递给客户端(通过节点服务器 )? 我怎样才能发送一个1位的数据结构到服务器? 我需要将我的位转换为hex(或更多)的数字并重新parsing吗? 有可能将其用作数据结构吗? 提前致谢, […]

为什么这个(部分)MergeSort实现吹的堆栈?

我正在经历制作自己的MergeSort实现的步骤。 它是recursion的,有一个基本的情况。 我没有做的唯一的事情就是长度为%2!= 0的数组不完美。所以你必须插入2 ^ n长度的数组。 我可以稍后解决。 但是,当我插入一个长度为4的数组时,我得到一个堆栈溢出。 为什么? 代码如下: function mergeSort(arr){ // step 0 – establish the variables let newArr = [], len = arr.length; // step 1 – divide the problem into smaller parts until no longer possible if(len <= 1){ return arr; } if (len === 2){ newArr = (arr[0] < arr[1]) […]

我怎样才能find在一个范围内随机非重复整数string中的缺less整数

即使开始考虑如何做到这一点,我也遇到了麻烦。 我需要find一个没有分隔符的随机数字串中缺less的数字。 这里是一个例子: 14036587109 。 在这个例子中,缺less的数字是2 ,范围是0-10 (含)。 我怎样才能编写一个JavaScript / Node.JS程序来解决这个问题? 我无法弄清楚的是该程序是如何分离数字的; 在上面的例子中,程序如何知道数字10 (在最后一个数字之前)不是数字1和0 。

运行随机数字并保持状态

我使用下面的代码从指定的范围内获得随机值 var provideRanges = function(){ var aa = []; _.times(3, function(i) { console.log(i); let num = _.random(10, 20) console.log("num = :" + num) debugger; aa.push(num); console.log("value is :" + aa[i]); }); } 当你调用这个函数的时候,这是工作的,并且提供了在指定范围内的3个数组,但是当我需要的时候,这个问题变得更加困难,如果我再次调用它,忽略从提供的数字中排除之前提供的数字(就像它提供10,11,12下一次这些数字不应该提供…),是否有更好的方法来做到这一点? 我尝试使用recoursive电话,但迷路:(任何想法如何做到这一点?

n的有效计算在Node.js中selectk

我有一些性能敏感的代码需要计数组合的Node.js服务器上。 从这个答案 ,我用这个简单的recursion函数来计算nselectk: function choose(n, k) { if (k === 0) return 1; return (n * choose(n-1, k-1)) / k; } 那么既然我们都知道迭代几乎总是比recursion快,我写了这个函数的基础上的乘法公式 : function choosei(n,k){ var result = 1; for(var i=1; i <= k; i++){ result *= (n+1-i)/i; } return result; } 我在我的机器上运行了一些基准testing 。 下面是其中一个的结果: Recursive x 178,836 ops/sec ±7.03% (60 runs sampled) Iterative x […]

find免费的端口不用于应用程序 – find一些algorithm

我在我的程序中使用以下API来设置自由端口并将其提供给应用程序运行 portscanner.findAPortNotInUse(3000, 65000, '127.0.0.1', function(error, port) { console.log('AVAILABLE PORT AT: ' + port) }) https://github.com/baalexander/node-portscanner 这个自由端口被给予应用程序使用和工作正常。 问题是,如果我给application A提供一个自由端口,并且应用程序还没有占用它(有时需要一些时间…),并且有其他application B请求一个空闲端口,所以它给APP B应用程序的端口A导致问题…是否有任何优雅的方式来解决它? 我的应用程序没有状态,所以它不能保存到哪个应用程序获取哪个端口… 有解决scheme,我们可以随机的范围,但这是不健壮的… 在我的应用程序中获取我应该提供免费的端口运行的应用程序的URL。 更新 我不能使用一些经纪人或别的什么东西可以控制这个外面我需要find一些algorithm (也许有一些聪明的随机),可以帮助我在内部做,即我的程序是像单身人士,我需要一些技巧,如何给端口50000 to 65000 ,这将减less提供给应用程序的端口的冲突量 更新2 我决定尝试下面这样的事情,你觉得怎么样? 使用lodash https://lodash.com/docs/4.17.2#random来确定提供3(或更多,如果有意义的话)数字的循环之间的端口,如下面的范围 portscanner.findAPortNotInUse([50001, 60000, 600010], '127.0.0.1', function(err, port) { if(err) { console.log("error!!!-> " +err); }else { console.log('Port Not in Use ' + port); } […]

hough变换 – javascript – node.js

所以,我试图实现霍夫变换,这个版本是基于次要属性的1维(它的所有变暗减less到1个昏暗的优化)版本。 封闭的是我的代码,具有示例图像…input和输出。 明显的问题是我做错了什么。 我翻了三倍检查我的逻辑和代码,它看起来也很好,我的参数。 但显然我错过了什么。 注意,红色像素应该是椭圆中心,而蓝色像素是要去除的边缘(属于符合math方程的椭圆)。 另外,我不感兴趣的openCV / matlab / ocatve /等..使用(没有任何反对他们)。 非常感谢你! var fs = require("fs"), Canvas = require("canvas"), Image = Canvas.Image; var LEAST_REQUIRED_DISTANCE = 40, // LEAST required distance between 2 points , lets say smallest ellipse minor LEAST_REQUIRED_ELLIPSES = 6, // number of found ellipse arr_accum = [], arr_edges = [], edges_canvas, […]

我如何更快地匹配这个文本?

我正在为名字build立一个自动build议。 当用户在文本框中input时,它会碰到服务器并运行: var names = [ list of 1000 names ]; //I have a list of 1000 names, this is static. var query = 'alex'; var matched_names = []; //This is when it gets slow…. names.forEach(function(name){ if(name.indexOf(query) >= 0){ matched_names.push(name); } }); return matched_names; 我怎样才能使这个更快? 我正在使用Node.js

像维基百科上所说的那样实现LLLalgorithm,但却陷入严重的问题

我不确定我的问题与编程有关,或与LLLalgorithm的概念有关,以及维基百科上提及的内容。 我决定实施LLLalgorithm,因为它已经写在维基百科上 (逐行/逐行)实际学习algorithm,并确保它是真正的工作,但我得到意想不到或无效的结果。 所以,我使用JavaScript(编程语言)和node.js(JavaScript引擎)来实现它, 这是获取完整代码的git存储库 。 长话短说,K的值超出范围,例如当我们只有3个向量(数组大小为3,因此索引的最大值将是2)时,K的值将超出范围,但是k变为3并且是无意义的。 我的代码是维基百科上提到的algorithm的一步一步(逐行)实现,我所做的只是实现它。 所以我不是什么问题。 // ** important // {b} set of vectors are denoted by this.matrix_before // {b*} set of vectors are denoted by this.matrix_after calculate_LLL() { this.matrix_after = new gs(this.matrix_before, false).matrix; // initialize after vectors: perform Gram-Schmidt, but do not normalize var flag = false; // invariant var k […]

原生JavaScriptsorting执行比实施mergesort和quicksort慢

我已经实现了一个mergesort和一个quicksort来比较它们与原生JavaScriptsorting。 对于quicksort我试图使用这个algorithm: 在YouTube上查看algorithm 。 两种algorithm都使用尽可能less的内存,对于合并sorting,为每个recursion调用传递一个辅助数组(以避免开销),并为快速sorting开始和结束位置的位置。 我正在使用sorting来pipe理NodeJs应用程序中的大量数据。 下面你有mergesort,quicksort和本地JavaScriptsorting,你可以testing性能 问题是:为什么本机JavaScriptperformance较慢? 在我的情况下: Chrome – 合并sorting:测量:1997.920ms; 快速sorting:测量:1755.740ms; 原产地:措施:4988.105ms 节点:合并sorting:测量:2233.413ms; 快速sorting:测量:1876.055ms; 本机:测量:6317.118ms 合并sorting var length = 10000000; // ten millions; var arr = []; for (let i = length; i > 0; i–) { // random array arr.push(parseInt(Math.random() * 1000000000)); } var mergeSort = function(array) { function merge(arr, aux, lo, […]