6
$\开始组$

我有一个嵌套列表,它由一系列1后面跟着一系列0组成。

p=表[PerfectNumber[n],{n,5}];i=整数位数[p,2]

这将导致:

{{1, 1, 0}, {1, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 0, 0, 0, 0}, {1, 1, 1, 1,1, 1, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}

现在我想要一个列表,它能给我最大数量的连续的在每个列表中都是1(是的,我意识到在给定的示例中它们都是连续的,但我对更通用的解决方案感兴趣):

{2, 3, 5, 7, 13}

我如何才能做到这一点?

$\端组$

5个答案5

重置为默认值
4
$\开始组$

使用最长公共子序列

(*借用eldo的列表*)列表={{1, 1, 2, 1},{1, 1, 1, 0, 3, 1},{4, 1, 1, 1, 1, 1, 0, 1, 1}};长度@最长通用子序列[#,案例[1]@#]&/@列表

{2, 3, 5}

$\端组$
6
$\开始组$
列表={{1, 1, 0}, {1, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};

计数[1]/@list

{2, 3, 5, 7, 13}

回答附加问题:每个列表中连续1s的最大数量

列表={{1, 1, 0, 1},{1, 1, 1, 0, 0, 1},{0, 1, 1, 1, 1, 1, 0, 1, 1}};ones=SequenceSplit[#,{0}]&/@list

{{{1, 1}, {1}}, {{1, 1, 1}, {1}}, {{1, 1, 1, 1, 1}, {1, 1}}}

Max/@Map[长度,个,{2}]

{2, 3, 5}

更通用的解决方案使用除了

列表={{1, 1, 2, 1},{1, 1, 1, 0, 3, 1},{4, 1, 1, 1, 1, 1, 0, 1, 1}};

Max/@Map[Length,SequenceSplit[#,{Except[1]}]&/@list,{2}]

{2, 3, 5}

$\端组$
1
  • 1
    $\开始组$ 请查看更新的答案 $\端组$
    – 埃尔多
    5月18日6:26
5
$\开始组$

您还可以在1序列上进行拆分:

最大[SequenceSplit[#,ones:{1.}:>长度[ones]]&/@list

或者序列案例:

最大[SequenceCase[#,ones:{1.}:>长度[ones]]&/@list

或者使用减少模式:

GroupBy[Split[#],First->Length,Max][1]和/@list
$\端组$
5
$\开始组$
最大/@总计[(拆分/@lst),{3}](* {2, 3, 5, 7, 13} *)
lst={{1,1,0},{1,1,1,0,0},1}, {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1}}
$\端组$
$\开始组$

如果我们以一种简单的方式来看待您的问题,我们可以看到一个函数通过接收1来递增,通过接收0来重置(类似于乘法,但带有递增)。由于我们需要上一次计算的结果折叠家人应该记住:

p=表[PerfectNumber[n],{n,5}];i=整数位数[p,2];函数[x,Max[FoldList[(#1+1)*#2&,x]]/@i(*输出:{2,3,5,7,13}*)

如果我们扩大投入,我们可以比较不同的解决方案。这里我们将创建1000个长度可变的0和1列表:

种子随机[4567];i=表格[RandomInteger[1,RandomIntiger[{10,100}]],1000];(*验证每个列表是否至少有一个1-缺少时某些算法会失败*)最小值[Total/@i](*输出:3*)
重复计时 最大内存使用量
文件夹列表[。。。 0.038378 66472
文多波纳的长度[LongestCommonSubsequence[。。。 0.018285 69088
用户1066的最大值/@总计[。。。。 0.046171 2110792
勒里克的最大值[SequenceSplit[。。。 4.27892 279952
勒里克的最大[SequenceCases[。。。 4.553 350896
勒里克的GroupBy[拆分[。。。 0.022229 70200
埃尔多的Max/@Map[。。。 0.217163 3346872

所有这些都会产生相同的结果。

由于我们使用的是原语操作,人们可能会想看看新编译器的可能性(需要12.0+版):

fn=函数编译[函数[Typed[x,“NumericArray”::[“Integer64”,1]],最大@文件夹列表[(#1+1)*#2&,x]]];fn/@i;//最大已用内存//重复计时(*输出:{0.0008890766240}*)

就在附近速度快20倍比以前最快的解决方案!

基准测试是在Windows 11上的Mathematica 14.0.0上完成的。

$\端组$

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.