首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何记住Haskell中二进制搜索树的根?

如何记住Haskell中二进制搜索树的根?
EN

Stack Overflow用户
提问于 2022-01-05 22:36:17
回答 4查看 216关注 0票数 6

我对函数式编程很陌生。

我面临的挑战是关于在Haskell中二进制搜索树是如何工作的心理地图。

  1. 在其他程序(C,C++)中,我们有一个叫做根的东西。我们把它存储在一个变量中。我们将元素插入其中并进行平衡等等。
  2. 这个程序需要休息一下,做其他事情(可能是进程用户输入,创建线程),然后计算出它需要在已经创建的中插入一个新元素。它知道根(存储为变量),并使用根和新值调用插入函数。

到目前为止其他语言都很好。但是我在Haskell怎么模仿这样的东西呢?

  1. 我看到一些函数实现了将列表转换为二叉树、插入值等等。一切都很好
  2. 我希望这个功能成为一个更大的程序的一部分,所以我需要知道根是什么,以便我可以使用它再次插入它。这有可能吗?如果是的话,怎么做?

注意:难道根本不可能因为数据结构是不可变的,因此我们根本不能使用根来插入某些内容。在这种情况下,Haskell是如何处理上述情况的?

EN

回答 4

Stack Overflow用户

发布于 2022-01-05 23:36:51

这一切都是以同样的方式发生的,只是我们没有改变现有的树变量,而是从它派生出一棵新树,并记住新树而不是旧树。

例如,您所描述的流程的C++草图可能如下所示:

代码语言:javascript
运行
AI代码解释
复制
int main(void) {
  Tree<string> root;
  while (true) {
    string next;
    cin >> next;
    if (next == "quit") exit(0);
    root.insert(next);
    doSomethingWith(root);
  }
}

一个变量,一个读操作,和一个变异步骤的循环。在haskell中,我们做同样的事情,但是使用递归来循环和递归变量,而不是变异一个本地变量。

代码语言:javascript
运行
AI代码解释
复制
main = loop Empty
  where loop t = do
    next <- getLine
    when (next /= "quit") $ do
      let t' = insert next t
      doSomethingWith t'
      loop t'

如果您需要doSomethingWith来“变异”t并阅读它,您可以将您的程序提升到状态:

代码语言:javascript
运行
AI代码解释
复制
main = loop Empty
  where loop t = do
    next <- getLine
    when (next /= "quit") $ do
      loop (execState doSomethingWith (insert next t))
票数 9
EN

Stack Overflow用户

发布于 2022-01-05 23:48:11

用BST编写一个示例需要花费太多的时间,但是我使用列表给出了一个类似的例子。

让我们发明一个updateListN来更新列表中的第n个元素。

代码语言:javascript
运行
AI代码解释
复制
updateListN :: Int -> a -> [a] -> [a]
updateListN i n l = take (i - 1) l ++ n : drop i l

现在我们的节目:

代码语言:javascript
运行
AI代码解释
复制
list = [1,2,3,4,5,6,7,8,9,10] -- The big data structure we might want to use multiple times

main = do
  -- only for shows
  print $ updateListN 3 30 list -- [1,2,30,4,5,6,7,8,9,10]
  print $ updateListN 8 80 list -- [1,2,3,4,5,6,7,80,9,10]
  -- now some illustrative complicated processing
  let list' = foldr (\i l -> updateListN i (i*10) l) list list
  -- list' = [10,20,30,40,50,60,70,80,90,100]
  -- Our crazily complicated illustrative algorithm still needs `list`
  print $ zipWith (-) list' list
  -- [9,18,27,36,45,54,63,72,81,90]

看看我们如何“更新”列表,但它仍然可用?Haskell中的大多数数据结构都是持久的,所以更新是无损的.只要我们有参考的旧数据,我们可以使用它。

至于你的评论:

我的程序正在尝试以下步骤( a)将列表转换为二进制搜索树( b)执行一些I/O操作( c)请求用户输入在创建的二进制搜索树中插入一个新值( d)将其插入到已经创建的列表中。这就是这个计划的目的。不知道如何在Haskell (或)完成这一任务,是因为我被困在了旧的思维模式中。欢迎任何想法/暗示。

我们可以勾勒出一个程序:

代码语言:javascript
运行
AI代码解释
复制
data BST
readInt :: IO Int; readInt = undefined
toBST :: [Int] -> BST; toBST = undefined
printBST :: BST -> IO (); printBST = undefined

loop :: [Int] -> IO ()
loop list = do
  int <- readInt
  let newList = int : list
  let bst = toBST newList
  printBST bst
  loop newList

main = loop []
票数 6
EN

Stack Overflow用户

发布于 2022-01-06 00:03:32

“做平衡”。“它知道根”不知道。在重新平衡后,根是新的。函数balance_bst必须返回新的根。

在Haskell也是如此,但insert_bst也是如此。它也将返回新的根,您将从这一点开始使用这个新根。

即使新根的值是相同的,在Haskell中也是一个新根,因为它的一个子根已经改变了。

参见''How to‘think“’‘这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70603384

复制
相关文章
Mysql 中二进制日志的初步认知
二进制日志中以“事件”的形式记录了数据库中数据的变化情况,对于MySQL数据库的灾难恢复起着重要的作用。
跟着飞哥学编程
2023/03/01
4610
Java中二进制转换的多种方法
使用方法如下: 通常十进制转其他进制使用辗转相除法来求解(除到结果为1停止),转换结果为最后的商(1)与过程中余数的倒叙结果。
秋名山码神
2022/12/13
8480
2021-07-13:恢复二叉搜索树。给你二叉搜索树的根节点 roo
2021-07-13:恢复二叉搜索树。给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?
福大大架构师每日一题
2021/07/13
3040
2021-07-13:恢复二叉搜索树。给你二叉搜索树的根节点 roo
leetcode树之从根到叶的二进制数之和
这里采用递归的方法,当node为null时返回0;之后对sum累加当前node.val;若node.left及node.right为null则返回sum,否则递归计算sumNode(node.left, sum)再累加上sumNode(node.right, sum)。
code4it
2020/09/28
3300
leetcode树之从根到叶的二进制数之和
这里采用递归的方法,当node为null时返回0;之后对sum累加当前node.val;若node.left及node.right为null则返回sum,否则递归计算sumNode(node.left, sum)再累加上sumNode(node.right, sum)。
code4it
2020/09/25
4390
leetcode树之从根到叶的二进制数之和
掉一根头发,彻底搞懂二叉搜索树
在数据结构与算法中,树是一个比较大的家族,家族中有很多厉害的成员,这些成员有二叉树和多叉树(例如B+树等),而二叉树的大家族中,二叉搜索树(又称二叉排序树)是最最基础的,在这基础上才能继续拓展学习AVL(二叉平衡树)、红黑树等知识。
bigsai
2021/04/12
5290
【说站】js中二分搜索的使用
1、二分搜索的前提是数组有序,从数组的中间元素开始。如果中间元素恰好是目标值,搜索就结束了。
很酷的站长
2022/11/24
4960
【说站】js中二分搜索的使用
Haskell
这门语言在数学模型上有着很深的优势,虽然它有很多特性,让人很难接受,随着学习的深入,你才会发现这会多么有趣。
icepy
2019/06/24
8900
Haskell doctest
一定要注意格式 第一行很重要,-- |这行没有就不是一个 test。 可以对比 >>> 的个数 和 terminal里的 Examples 个数确认是否自己的所有 test 都测试了
莫听穿林
2022/05/20
3210
Haskell doctest
LeetCode 538. 把二叉搜索树转换为累加树(逆中序 根右左)
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
Michael阿明
2021/02/20
4180
LeetCode 538. 把二叉搜索树转换为累加树(逆中序 根右左)
从根到叶的二进制数之和
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
利刃大大
2023/04/12
2120
Haskell Platform安装
不懂了,明天写
云深无际
2020/11/03
1.1K0
Haskell Platform安装
haskell 求助
findBonding :: Eq a => (a -> a -> Bool) -> [a] -> Maybe [(a,a)]
用户6797589
2019/12/02
5550
LeetCode 1038. 从二叉搜索树到更大和树(逆中序-右根左-降序)
1. 题目 2. 解题 二叉搜索树 逆中序遍历(右根左)是降序的 class Solution { public: TreeNode* bstToGst(TreeNode* root) {
Michael阿明
2021/02/20
3630
LeetCode 1038. 从二叉搜索树到更大和树(逆中序-右根左-降序)
如何轻松记住 Linux 命令
对于Linux的使用者来说,无论是菜鸟阶段还是大神阶段,往往都会对于命令行心存戒备:大量需要记忆的命令实在是令人痛苦。掌握命令是使用高效命令行工具的前提。 然而,这种痛苦的学习几乎没有捷径可走,你必须
小小科
2018/05/03
7960
如何轻松记住 Linux 命令
平衡搜索树
2-3树 ​ 其实仔细来看2-3树好像是 B 树的一个特例,它规定了一个节点要么有一个 key 要么有两个 key。 如果有一个 key 那么他就有两个子节点,左边小于这个 key 右边大于这个 key 如果有两个 key 那么他就有三个子节点,左边小于,中间处于两者之间,右边大于 ​ 这样一来就会发现他其实也会处在插入的时候出现分裂的情况,当一个节点需要插入的时候我们先让他插入,这时候可能出现一个节点有三个 key 的情况,我们就打出四个分支,然后我们把中间的那个 key 分裂到父节点
lwen
2018/04/17
9040
如何删除二叉搜索树中的节点?
题目链接:https://leetcode-cn.com/problems/delete-node-in-a-bst/
代码随想录
2021/09/08
1.4K0
如何删除二叉搜索树中的节点?
搜索树判断
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
叶茂林
2023/07/30
2030
LeetCode - 二叉搜索树中的搜索
原题地址:https://leetcode-cn.com/problems/search-in-a-binary-search-tree/
晓痴
2019/07/24
7280
LeetCode - 二叉搜索树中的搜索
如何轻松记住 Linux 命令
(点击上方蓝字,快速关注我们) 英文:Nick Congleton,翻译:Linux中国/DarkSun linux.cn/article-9093-1.html Linux 新手往往对命令行心存畏惧
精讲java
2018/07/03
9020

相似问题

Haskell中二进制搜索树的实现

14

Python中二进制搜索树的深度

10

haskell二进制搜索树

20

python中二进制搜索树的总深度

115

C++中二进制搜索树的实现

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文