滑动 Window SML 中的算法实现(新泽西州)
Sliding Window Algorithm Implementation in SML (NJ)
我是 SML 的新手,我想知道滑动 window 算法是否可以在 SMLNJ 中实现。由于 SML 是一种函数式语言,与我以前编写程序的语言(Python、C、C++)相比,我发现它相当困难,并且作为一种练习方式,我一直在尝试“翻译”一些我的其他程序到 SMLNJ。我在尝试“翻译”用 C 编写的程序时遇到了第一个障碍,该程序使用滑动 window 算法的变体。我希望我的 SML 代码不包含除基本 SMLNJ 包之外的任何其他签名(如果我的理解是正确的,它们就像库一样运行)。那么,在SMLNJ中是否有可能实现滑动window算法呢?可以通过列表来完成吗?或者我在想 wrong/missing 什么?我能找到的关于该主题的 material 相当有限,因此我们将不胜感激。我不需要答案,只需要一个正确的方向。
谢谢
是的,您当然可以在 SML 中实现滑动 window 算法!
例如,假设您要删除列表中相邻的重复项(例如,[1, 2, 3, 3, 2, 2]
会变成 [1, 2, 3, 2]
)。
以下是您可能会发现有用的两种技巧:
显式递归
fun clean (x1 :: x2 :: xs) = if x1 = x2 then clean (x2 :: xs) else x1 :: clean (x2 :: xs)
| clean l = l (* if l is [] or [x] *)
在这里,我们递归给定列表,删除相邻的重复元素。
尾部拉链
解决滑动 window 问题的一种常用技术涉及将一个元素与以下元素一起考虑。
通过在列表及其尾部使用 the ListPair
structure 可以恢复许多常用功能:
infix |>
fun x |> f = f x
fun clean [] = []
| clean (x :: xs) = x :: (
ListPair.zip (x :: xs, xs)
|> List.filter (fn (x1,x2) => x1 <> x2)
|> List.map (fn (_,x2) => x2)
)
(* or: *)
fun clean [] = []
| clean (x :: xs) = x :: (
ListPair.mapPartial
(fn (x1,x2) => if x1 = x2 then NONE else SOME x2)
(x :: xs, xs)
)
我是 SML 的新手,我想知道滑动 window 算法是否可以在 SMLNJ 中实现。由于 SML 是一种函数式语言,与我以前编写程序的语言(Python、C、C++)相比,我发现它相当困难,并且作为一种练习方式,我一直在尝试“翻译”一些我的其他程序到 SMLNJ。我在尝试“翻译”用 C 编写的程序时遇到了第一个障碍,该程序使用滑动 window 算法的变体。我希望我的 SML 代码不包含除基本 SMLNJ 包之外的任何其他签名(如果我的理解是正确的,它们就像库一样运行)。那么,在SMLNJ中是否有可能实现滑动window算法呢?可以通过列表来完成吗?或者我在想 wrong/missing 什么?我能找到的关于该主题的 material 相当有限,因此我们将不胜感激。我不需要答案,只需要一个正确的方向。
谢谢
是的,您当然可以在 SML 中实现滑动 window 算法!
例如,假设您要删除列表中相邻的重复项(例如,[1, 2, 3, 3, 2, 2]
会变成 [1, 2, 3, 2]
)。
以下是您可能会发现有用的两种技巧:
显式递归
fun clean (x1 :: x2 :: xs) = if x1 = x2 then clean (x2 :: xs) else x1 :: clean (x2 :: xs)
| clean l = l (* if l is [] or [x] *)
在这里,我们递归给定列表,删除相邻的重复元素。
尾部拉链
解决滑动 window 问题的一种常用技术涉及将一个元素与以下元素一起考虑。
通过在列表及其尾部使用 the ListPair
structure 可以恢复许多常用功能:
infix |>
fun x |> f = f x
fun clean [] = []
| clean (x :: xs) = x :: (
ListPair.zip (x :: xs, xs)
|> List.filter (fn (x1,x2) => x1 <> x2)
|> List.map (fn (_,x2) => x2)
)
(* or: *)
fun clean [] = []
| clean (x :: xs) = x :: (
ListPair.mapPartial
(fn (x1,x2) => if x1 = x2 then NONE else SOME x2)
(x :: xs, xs)
)