【问题标题】:Shortest subarray containing all elements without using arrays?包含所有元素而不使用数组的最短子数组?
【发布时间】:2019-08-18 04:22:53
【问题描述】:

问题:求包含所有元素的最短子数组的长度 示例:1 2 2 3 2 2 1 3 答案:3

我已经读过,解决这个问题的最佳方法是使用滑动窗口方法。但是这种方法需要使用数组。有没有其他有效的方法不需要通过存储每个元素的出现次数来使用数组? (我想通过在 ML 中编写来使用这种不带数组的方法)

【问题讨论】:

  • 是 ML Mark Logic 吗?
  • 我有一个想法,但它需要对输入进行一些限制。 0 可以是有效项目吗?负整数可以是有效项吗?输入可以是非整数吗?
  • @YuriyFaktorovich 没有输入的数字是自然的 (1,2,3,...)
  • 如果数组有 5 是否意味着它也必须有 1,2,3,4?或者数组可以像 [1,2,2,5,2,1]?

标签: arrays algorithm functional-programming ml


【解决方案1】:

我假设您想要避免使用数组的原因是您想要编写惯用 ML 代码,因此更愿意使用纯函数数据结构而不是可变数组?

如果是这样,那么您可以将purely functional red-black tree 用于“滑动窗口”方法,其方式与使用数组几乎完全相同;唯一的区别是:

  • 您有 O(log m) 次查找,而不是 O(1) 次查找,其中 m是不同元素的数量。
  • 您有 O(log m) 转换,而不是 O(1) 突变,其中转换返回修改后的副本地图(共享其大部分节点)。

【讨论】:

  • 我想这就是我想要的。我对 ML 很陌生,所以你能提供一些代码或算法来使它更容易吗?
  • @maverick98:您能否更具体地了解您要查找的代码? (红黑树的完整实现,加上使用这种树来解决问题中的问题的函数的完整实现,对于单个 Stack Overflow 答案来说可能太多了。您可以获得纯功能红色的实现- 通过 Google 提供的黑树,虽然我很乐意帮助您编写一个使用黑树的函数,但您应该先自己尝试一下。)
  • 其实我不知道如何调用红黑树,或者如何实现它以替换“滑动窗口”中使用的数组
  • @maverick98:对不起,这似乎还是太宽泛了。函数式编程是一种非常不同的范式,可以预料你会在它上面遇到一些困难。 (您可能想从更简单的问题开始。)但是请别人为您编写代码并不能真正帮助您学习。 :-/
  • 我不是一定要代码,我只是不明白如何使用红黑树来替换数组。什么时候,我怎么称呼它?
【解决方案2】:

我不明白你的数组问题。您没有指定您使用的是哪种 ML 系列语言,但 Ocaml(我最喜欢的语言)肯定有数组。如果出于某种宗教原因你真的不喜欢数组,你总是可以使用带有整数键的 Map,它的作用与数组相同,但速度要慢得多。

【讨论】:

  • 这听起来更像是评论而不是答案。
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 2015-01-08
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2023-03-17
  • 2019-11-17
  • 1970-01-01
相关资源
最近更新 更多