- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要根据 C#/Java 中的最小差异对数组数据进行分区。
Input: { A1, A2, B3, D4, C7, B12, A12, C14, D15, C22, A23, B25, A35, A36, D37 }
例如
B3、D4 之间的差异 = |3 - 4| = 1
A23、B25 之间的差异 = |23 - 25| = 2
D4、C7 之间的差异 = |4 - 7| = 3
B12、A12 之间的差异 = |12 - 12| = 0
规则是:
对于每个组,字母不能重复
对于每个组,它可以包含 1 - 4 个元素
元素之间的差异必须是 <= 3
Output: { A1 },{ A2, B3, D4, C7 },{ B12, A12, C14, D15 },{ C22, A23, B25 },{ A35 },{ A36, D37 }
最佳答案
在 Dyalog APL 中编码只用了 10 分钟并行数组处理语言,但是写答案花了我2个小时。我根本不会提交任何代码,以免打破问题中的语言限制,但我会尝试使用数据和一些伪代码来阐明下面的原则。
假设论证有固定顺序,则有512种可能的解法,如下:
┌──────────┬─┬─┬──┬──┬───┬───┬──┬──┬──┬──┬─────┐
│Partitions│6│7│8 │9 │10 │11 │12│13│14│15│Total│
├──────────┼─┼─┼──┼──┼───┼───┼──┼──┼──┼──┼─────┤
│Solutions │1│9│36│84│126│126│84│36│9 │1 │512 │
└──────────┴─┴─┴──┴──┴───┴───┴──┴──┴──┴──┴─────┘
最小分区 (6) 的解决方案是:
┌──┬───────────┬───────────────┬───────────┬───┬───────┐
│A1│A2 B3 D4 C7│B12 A12 C14 D15│C22 A23 B25│A35│A36 D37│
└──┴───────────┴───────────────┴───────────┴───┴───────┘
接下来的(有 7 个分区)是:
┌──┬───────────┬───────────────┬───────────────┬───────────┬───┬───────┐
│A1│A2 B3 D4 C7│B12 A12 C14 D15│C22 A23 B25 │A35 │A36│D37 │
├──┼───────────┼───────────────┼───────────────┼───────────┼───┼───────┤
│A1│A2 B3 D4 C7│B12 A12 C14 D15│C22 A23 │B25 │A35│A36 D37│
├──┼───────────┼───────────────┼───────────────┼───────────┼───┼───────┤
│A1│A2 B3 D4 C7│B12 A12 C14 D15│C22 │A23 B25 │A35│A36 D37│
├──┼───────────┼───────────────┼───────────────┼───────────┼───┼───────┤
│A1│A2 B3 D4 C7│B12 A12 C14 │D15 │C22 A23 B25│A35│A36 D37│
├──┼───────────┼───────────────┼───────────────┼───────────┼───┼───────┤
│A1│A2 B3 D4 C7│B12 A12 │C14 D15 │C22 A23 B25│A35│A36 D37│
├──┼───────────┼───────────────┼───────────────┼───────────┼───┼───────┤
│A1│A2 B3 D4 C7│B12 │A12 C14 D15 │C22 A23 B25│A35│A36 D37│
├──┼───────────┼───────────────┼───────────────┼───────────┼───┼───────┤
│A1│A2 B3 D4 │C7 │B12 A12 C14 D15│C22 A23 B25│A35│A36 D37│
├──┼───────────┼───────────────┼───────────────┼───────────┼───┼───────┤
│A1│A2 B3 │D4 C7 │B12 A12 C14 D15│C22 A23 B25│A35│A36 D37│
├──┼───────────┼───────────────┼───────────────┼───────────┼───┼───────┤
│A1│A2 │B3 D4 C7 │B12 A12 C14 D15│C22 A23 B25│A35│A36 D37│
└──┴───────────┴───────────────┴───────────────┴───────────┴───┴───────┘
最后一个(分为15个分区)自然是:
┌──┬──┬──┬──┬──┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│A1│A2│B3│D4│C7│B12│A12│C14│D15│C22│A23│B25│A35│A36│D37│
└──┴──┴──┴──┴──┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
解决此问题的最好、最安全的方法是使用蛮力并遍历所有可能性。首先,您需要调整使用零和一来指示分区位置的原则。由于参数中有 15 个元素,我们使用 15 长度的二进制 vector 来完成这项工作。示例:
(1 0 0 1 0 0 0 0 1 0 0 1 0 0 0) partition 'stackoverflowex'
暗示/应返回 4 个分区:
┌───┬─────┬───┬────┐
│sta│ckove│rfl│owex│
└───┴─────┴───┴────┘
您还可以划分另一个 15 长度的 boolean vector :
(1 0 0 1 0 0 0 0 1 0 0 1 0 0 0) partition (1 1 0 0 1 1 0 1 0 0 0 1 1 0 0)
应返回:
┌─────┬─────────┬─────┬───────┐
│1 1 0│0 1 1 0 1│0 0 0│1 1 0 0│
└─────┴─────────┴─────┴───────┘
并且您可以计算每个分区中的总和。上面的那个会返回:
┌─┬─┬─┬─┐
│2│3│0│2│
└─┴─┴─┴─┘
要解决您的问题,您必须生成所有可能的分割 vector 。做起来比说起来简单。您只需要这两者之间的所有分区 vector :
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 // This would create 1 single, big partition
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 // This would create 15 small partitions
这些是什么?非常简单,它们是 16384 和 32767 的 2 进制(二进制)表示。您必须简单地遍历 16384 和 32767 之间的所有数字(包括两者),将每个数字转换为 2 进制,将您的数据,并查看当前分区是否可以接受(= 满足您的标准,例如“对于每个组,字母不能重复”)。转换区间内的所有数字将覆盖所有可能的分区 - 零和一的任何可能组合都在其中。计算只需要几分之一秒。
伪:
// The character part of the argument: 15-length vector of characters:
Chars = "A","A","B","D","C","B","A","C","D","C","A","B","A","A","D"
// From that, extract the locations of the unique characters:
CharsA = 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0 // Where Chars == A
CharsB = 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 // Where Chars == B
CharsC = 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 // Where Chars == C
CharsD = 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 // Where Chars == D
// The numeric part of the argument: 15-length vector of numbers:
// Btw, is this about lottery... hmmm
Nums = 1, 2, 3, 4, 7, 12, 12, 14, 15, 22, 23, 25, 35, 36, 37
:For Number :In [all numbers between 16384 and 32767]
Base2 = [2-base of Number] // 20123 would give: 1 0 0 1 1 1 0 1 0 0 1 1 0 1 1
// Test 1: "For each group, it can contains 1 - 4 elements"
[using Base2, partition the partition vector Base2 itself;
bail out if any partition length exceeds 4]
// Test 2: "Difference between element must be <= 3"
[using Base2, partition Nums;
check differences inside each partition;
bail out if bigger than 3 anywhere]
// Test 3: "For each group, letter cannot be repeated"
[using Base2, partition CharsA, CharsB, CharsC, CharsD (each in turn);
count number of ones in each partition;
bail out if exceeds 1 anywhere (meaning a character occurs more than once)]
// If we still are here, this partition Number is ACCEPTABLE
[add Number to a list, or do a parallel boolean marking 1 for Number]
:End
至此,512 个号码满足了指定的条件,而其余号码在某些测试中未通过。纯属巧合,它们是 512,这对我们程序员来说是一个特殊的数字。假设您现在在名为 Result 的变量中有 512 个可接受的数字。现在您需要对其进行排序,方法是解析每个结果中的分区数(= 二进制表示中的分区数)。为此,请再次将结果中的每个数字转换为基数 2,然后对每个数字中的个数进行计数并求和,然后按该和升序排序。最小的总和为 6,并且只出现一次 - 这是此答案顶部提到的分区。
它的值为 25126,它的 2-base 是
1 1 0 0 0 1 0 0 0 1 0 0 1 1 0
关于java - 数组分区最小差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077074/
是一种在 Neo4j 分区之间进行物理分离的方法吗? 这意味着以下查询将转到 node1: Match (a:User:Facebook) 虽然此查询将转到另一个节点(可能托管在 docker 上)
我尝试在我的 SQL 服务器上使用分区函数对我的一个大表进行分区,但我收到一条错误消息 “只能在SQL Server企业版中创建分区功能。只有SQL Server企业版支持分区。” 所以我想知道没有企
在hadoop文件系统中,我有两个文件,分别是X和Y。通常,hadoop制作的文件X和Y的大小为64 MB。是否可以强制hadoop划分两个文件,以便从X的32 MB和Y的32 MB中创建一个64 M
据我了解,如果我们有一个主键,则使用该键对数据进行分区并将其存储在节点中(例如使用随机分区器)。 现在我不确定的是,如果我有多个键(又名复合键),是用于分区数据的键的组合还是它将是第一个主键? 例如,
我正在向我的 SSAS 多维数据集添加分区,我想知道是否有多个分区可以保留在下面?多少太多了,最佳实践限制是 20 还是 200?有没有人可以分享任何真实世界的知识? 最佳答案 这是 another
我有一个包含大约 200 万条记录的大表,我想对其进行分区。 我将 id 列设置为 PRIMARY AUTO_INCRMENT int (并且它必须始终是唯一的)。我有一列“theyear”int(4
我正在做 mysql 列表分区。我的表数据如下 ---------------------------------------- id | unique_token | city | student_
我有一个表,我们每天在其中插入大约 2000 万个条目(没有任何限制的盲插入)。我们有两个外键,其中一个是对包含大约 1000 万个条目的表的引用 ID。 我打算删除此表中超过一个月的所有数据,因为不
我想在一款足球奇幻游戏中尝试使用 MySQL Partitioning,该游戏的用户分布在联赛中,每个联赛都有一个用户可以买卖球员的市场。当很多用户同时玩时,我在这张表中遇到了一些僵局(在撰写本文时大
我是 jQuery 的新手,想知道是否可以获取一些变量并将它们的除法作为 CSS 宽度。到目前为止我在这里: var x = $(".some-container").length; var y =
所以我正在做家庭作业,我需要为分区、斯特林数(第一类和第二类)和第一类的切比雪夫多项式创建递归函数。我的程序应该能够让用户输入一个正整数 n,然后创建名为 Partitions.txt、Stirlin
我在数据框中有一列,其中包含大约 1,4M 行聊天对话,其中每个单元格中的一般格式为 (1): “名称代理 : 对话” 但是,并非列中的所有单元格都采用这种格式。有些单元格只是 (2): “对话” 我
我在尝试隐藏 a 时遇到了一些问题,直到用户单击某个元素为止。 HTML 看起来像: BRAND item 1 item 2 item 3
一.为什么kafka要做分区? 因为当一台机器有可能扛不住(类比:就像redis集群中的redis-cluster一样,一个master抗不住写,那么就多个master去抗写)
我有一些销售数据,我需要发送存储在单独表中的可用槽中的数量。 销售数据示例: id数量112131415369 create table sales (id serial primary key, q
我计划设置多个节点以使用 glusterfs 创建分布式复制卷 我使用主(也是唯一)分区上的目录在两个节点上创建了一个 gluster 复制卷。 gluster volume create vol_d
我正在尝试使用 sum() over (partition by) 但在总和中过滤。我的用例是将每个产品的 12 个月累计到一个月的条目,因此: ITEM MONTH SALES Item
是否可以创建多个 Enumerators出单Enumerator ? 我正在寻找的相当于 List.partition返回 (List[A], List[A]) ,比如 List().partitio
我正在创建一个基于 x86 的非常简单的 Yocto 图像。 我希望/文件系统是只读的,所以我设置了 IMAGE_FEATURES_append = " read-only-rootfs " 在原件的
是否可以使用一次 collect 调用来创建 2 个新列表?如果没有,我该如何使用分区来做到这一点? 最佳答案 collect(在TraversableLike上定义并在所有子类中可用)与集合和Par
我是一名优秀的程序员,十分优秀!