- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要一种算法来对值数组进行等分。我将使用 JavaScript 进行演示,但可以应用任何语言。
我有一个数值数组,数量和数值都是随机的例如:
[5,9,14,18,19,29,49,59,89,99,129,159,189,199,259,299,599]
(我注意到的一个特点是值呈指数增长)
我需要将这个数组分成固定数量的组,这样所有的项目数量都接近并且组之间第一项与最后一项的差异不是很大。在这种情况下,我将分成 4 组。
问题:如果我将等量分成 4 组,相对于其他组,组中的第一项可能比最后一项小得多。如果我将值范围相等的 4 组分成 4 组,相对于其他组,一组的项目可能很少。
我想在中间找到某个地方,但我还没有找到解决方案。
可接受的解决方案示例:
[
[5,9,14,18,19,29],
[49,59,89,99],
[129,159,189,199],
[259,399,599],
]
如果有人不明白问题,请发表评论。
应用:显示值范围的过滤器。它将显示如下:
我不能展示的是这样的:
感谢您的帮助!
大差异——从小值跳到大值
另一个可能的例子:
[1, 2, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 19, 20, 21, 22, 25, 32, 33, 34, 35, 36, 38, 39, 40, 48, 49, 50, 55, 56, 57, 60, 61, 62, 70, 72, 73, 74, 75, 80, 100, 150, 300]
和
[830, 1790,1990,1990,2390,2420,2599,2690,2890,3124,3340,3404,3460,3497,3590,3590,3598,3620,3690,3725,3725,3774,3780,3798,3865,3885,3890,3929,3949,3990,3990,3998,4080,4099,4128,4132,4183,4190,4199,4250,4290,4290,4290,4420,4490,4496,4507,4590,4599,4680,4750,4790,4790,4890,4898,4990,4999,5190,5299,5390,5396,5530,5590]
最佳答案
这是对数据的对数 View 的近似值,并以相等的间隔对其进行分组。
它通过计算结果集的索引来推送值。
在 test
中,您会得到整数,第一个值始终索引为零,最后一个值小于所需部分的数字(为此,我取一个小于一的因子,因为有人会将最后一项移到数组的所需长度之外)。
var data = [5, 9, 14, 18, 19, 29, 49, 59, 89, 99, 129, 159, 189, 199, 259, 299, 599],
parts = 5,
smallerThanOne = 0.9999999999999999,
interval = Math.log(data[data.length - 1] / data[0]),
test = data.map(function (a) {
return parts * smallerThanOne * Math.log(a / data[0]) / interval;
}),
grouped = data.reduce(function (r, a) {
var i = Math.floor(parts * smallerThanOne * Math.log(a / data[0]) / interval);
r[i] = r[i] || [];
r[i].push(a);
return r;
}, []);
console.log(grouped);
console.log(test);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 等分值算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43254708/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!