- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我来自命令式背景,正在尝试实现一个简单的不相交集(“union-find”)数据结构,以获得在 Haskell 中创建和修改(持久)数据结构的一些练习。目标是有一个简单的实现,但我也关心效率,我的问题与此相关。
首先,我创建了一个按等级并集的不相交集森林实现,并首先为“点”定义数据类型:
data Point = Point
{ _value :: Int
, _parent :: Maybe Point
, _rank :: Int
} deriving Show
脱节的集合森林是一个具有 Int → Point
映射的 IntMap
:
type DSForest = IntMap Point
empty :: DSForest
empty = I.empty
单例集只是从其值x到值为x的点的映射,没有父级且等级为1:
makeSet :: DSForest -> Int -> DSForest
makeSet dsf x = I.insert x (Point x Nothing 0) dsf
现在,有趣的部分 - union
。此操作将通过将另一个点设置为其父点来修改一个点(并且在某些情况下更改其排名)。在Point
的等级不同的情况下,Point
只需“更新”(创建一个新的Point)以使其父点指向另一个点。如果它们相等,则会创建一个新的 Point
,其等级增加 1:
union :: DSForest -> Int -> Int -> DSForest
union dsf x y | x == y = dsf
union dsf x y =
if _value x' == _value y'
then dsf
else case compare (_rank x') (_rank y') of
GT -> I.insert (_value y') y'{ _parent = Just x' } dsf
LT -> I.insert (_value x') x'{ _parent = Just y' } dsf
-- 1) increase x's rank by one:
EQ -> let x'' = x'{ _rank = _rank x' + 1 }
-- 2) update the value for x's rank to point to the new x:
dsf' = I.insert (_value x'') x'' dsf
-- 3) then update y to have the new x as its parent:
in I.insert (_value y') y'{ _parent = Just x'' } dsf'
where x' = dsf ! findSet dsf x
y' = dsf ! findSet dsf y
现在,对于我真正的问题,如果在 EQ
情况下我做了以下操作:
EQ -> let dsf' = I.insert (_value x') x'{ _rank = _rank x' + 1} dsf
in I.insert (_value y') y'{ _parent = Just x'{ _rank = _rank x' + 1 }} dsf'
即首先插入一个新的Point
x,其等级增加,然后让y'
的父级成为一个新的Point
x 随着其排名的提高,这是否意味着它们不再指向内存中的同一个点
?(这还重要吗?应该我在使用/创建持久数据结构时担心这些事情?)
为了完整起见,这里是 findSet
:
findSet :: DSForest -> Int -> Int
findSet dsf' x' = case _parent (dsf' ! x') of
Just (Point v _ _) -> findSet dsf' v
Nothing -> x'
(也欢迎对此代码的效率和设计提出一般性评论。)
最佳答案
would this mean that they no longer point to the same Point in memory?
我认为您不应该关心这一点,因为这只是不可变值的运行时系统(又名 Haskell 的 RTS)的实现细节。
就其他建议而言,我建议让函数 findSet
返回 Point
本身而不是键,因为这会消除 中的查找联盟
。
findSet :: DSForest -> Int -> Point
findSet dsf' x' = case _parent pt of
Just (Point v _ _) -> findSet dsf' v
Nothing -> pt
where
pt = (dsf' ! x')
在 union
函数中进行适当的更改。
关于haskell - 我是否需要采取明确的操作来促进与持久数据结构的共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18076891/
我的类有一个 foo 方法和一个 main 方法,其中有一些变量和一个 print 语句。 public static boolean foo(int x, boolean b) { if (
我正在尝试对每几列取行平均值。这是一个示例数据集。 d = {'2000-01': range(0,10), '2000-02': range(10,20), '2000-03': range(10,
在 Nsight Visual Studio 中,我们将有一个图表来呈现“已采取”、“未采取”和“分歧”分支的统计信息。我对“不采取”和“分歧”之间的区别感到困惑。例如 kernel() { if
在 Nsight Visual Studio 中,我们将有一个图表来呈现“已采取”、“未采取”和“分歧”分支的统计信息。我对“不采取”和“分歧”之间的区别感到困惑。例如 kernel() { if
int main() { long int i,t,n,q[500],d[500],s[500],res[500]={0},j,h; scanf("%ld",&t); whil
我在 Linux 上使用 racket v6.5 repl 并尝试运行流教程中的 take 函数示例 https://docs.racket-lang.org/functional-data-stru
tl;博士无法在 ggpairs 中获得独立的图例(描述整个情节的常用颜色)令我满意。 对不起,长度。 我正在尝试使用 GGally::ggpairs 绘制(下三角形)对图(用于绘制各种绘图矩阵的扩展
几个月前我问过this question 。我想添加一个具有不同背景的相同 div。我想知道为什么 jQuery 在第二个 div 中不起作用?我发现仅当我单击第二个 div 中的小图像时,图像才会在
引用Performing a right join in django ,当我尝试类似的方法时(字段略有不同): class Student: user = ForeignKey(User)
所以我使用带有 Action Sheet 样式的 UIAlertController 来显示两个选项,一个用于取消操作,另一个用于删除数据。按钮工作正常,删除按钮工作,操作表关闭。我的问题是,在后台从
我有一个列表,其中每个单元格都是一个可放置的对象,可以接受某个类的可拖动对象。该表的边框是可见的,但我不希望固定大小的单元格着色且可见,这对我来说很难看。当我拖动一个可拖动对象与一个单元格相交时,该单
我有一个 RDD,它是通过读取一个大小约为 117MB 的本地文本文件形成的。 scala> rdd res87: org.apache.spark.rdd.RDD[String] = MapPart
如果我们有 n 级台阶并且我们可以一次上 1 或 2 级台阶,则台阶数和攀登台阶的方式之间存在斐波那契关系。当且仅当我们不认为 2+1 和 1+2 不同。 但是,情况不再如此,我们还必须添加第三个选项
var query = from ch in Client.wcf.context.CashHeading where ch.Id_customer == customern//cc.Id
我是一名优秀的程序员,十分优秀!