一组已知长度的数,按预设百分比分成两组 ab,这两组中其中一组 a 可以一对多另一组 b 的数,即可以 a 中某个数可以快速匹配另一组的几个数

203 天前
 iloooo

大佬们,求助此情形需要使用什么算法,可以快速确立 ab 的对应关系

确认算法后,是否可以使用 java 来设计下,要求高性能,感激~

586 次点击
所在节点    算法
9 条回复
leavebody
203 天前
是我的理解能力太差,还是楼主的表达能力一言难尽。。。
jifengg
203 天前
@leavebody 别怀疑自己。

另外,楼主,在不清楚你的需求的前提下,如果你不限制内存使用,那么就用 Map 把,o(1)时间复杂度
edward1987
203 天前
看不懂+1 ,还是具体拿一些数字举例吧
iloooo
203 天前
@edward1987 @jifengg @leavebody 补充补充:
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double percentage = 0.6; // 60%的数据分到 a 组,40%的数据分到 b 组

最终想得到效果是:
Map:{
7 -> 1,2
8 ->3,4
9 -> 5
10 -> 6
}
因为比例关系,两个数组肯定有个多有个少,少的来 1 对多
leavebody
203 天前
@iloooo 直接用你这个 map 的数据结构有什么问题吗,构造过程时间复杂度 O(n),查询时间复杂度 O(1)
iloooo
203 天前
@leavebody 业务上每个数字将涉及一次 “存对应关系” 和一次 “取此此数字对应其他数字”,时间维度是确认存比取早;不过构造对应关系这边有问题,数字多线程每秒产生的,归类成数组时是每分钟。所以构造时其实想得到的是一个计算标识,使得下个数字存取时动态知道了自己的存取逻辑,哈哈哈 有点绕
iloooo
203 天前
@leavebody 当然也可以把业务搞简单,所有此数组的取都必须延迟 1 分钟,这样取的时候数组对应关系已确认了,不过尽量想找到不延迟的办法
edward1987
203 天前
大概知道你啥意思了。
先根据比例来算出多少个数字 x 算一个循环。 比如 40% 那就是 3:2 ,就是 5 个数字一个循环。x=5 。
然后进来一个数 n ,算出它在那个循环基数先,比如 3 在第一个循环,8 则是在第二个循环。但是对应 3 和 8 对应的取数逻辑是一致的。
1->2 , 3->4, 1->5
如果是第二个循环则是
6->7,8->9,6->10

当进来一个数之后 比如 24 ,循环 bias 是 20 , 取数逻辑同 4 ,所以是 23->24
dahuahua
203 天前
我应该理解你的需求了,O(1)复杂度的公式就能计算出来。设分组后两边数组的长度分别为 a, b(a > b),实际上 a - b 就能得出能够一一对应的个数,反之能推算出 a 组中需要二次分组的长度,那么接下来就是要知道每个分组的长度是多少,这个也很好算,除一下就行了,最后再把数组的下标跟 a,b 的关系梳理一下就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/987148

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX