gpt4 book ai didi

sorting - 使用哈希表在 Racket 中更快地排序

转载 作者:行者123 更新时间:2023-12-04 19:02:33 24 4
gpt4 key购买 nike

所以我有一个像这样的元素列表

(define A (list 'a 'c 'd 'e 'f 'e 'a))

现在我想根据这个样本进行排名
(define (scan lst)
(foldl (lambda (element a-hash) (hash-update a-hash element add1 0))
(hash)
lst))

结果应该是这样的:
> #(('a . 2) ('f . 1) ('e . 2) ....)

因为`scan 函数将创建一个哈希表,其中包含唯一键和该键的重复次数(如果它捕获一个未索引的键,它将为该新键创建一个新位置,从 0 开始计数)。

然后我想对该哈希表进行排序,因为它是未排序的:
(define (rank A)
(define ranking (scan A))
(sort ranking > #:key cdr)))

所以结果应该是这样的:

#(('a . 2) ('e . 2) ('f . 1) ...)



现在我想截断哈希表并在 n = 1 的阈值处丢弃底部(也就是只取重复超过 2 次的元素)。
(define (truncate lst n)
(define l (length lst))
(define how-many-to-take
(for/list
([i l]
#:when (> (cdr (list-ref lst i))
n))
i))
(take lst (length how-many-to-take)))

所以结果可能是这样的:

(('a . 2) ('e . 2))



但是,在大范围内,此过程效率不高,耗时太长。你有什么建议来提高性能吗?

非常感谢,

第 2 部分:

我有这个数据结构:
(automaton x 
(vector (state y (vector a b c))
(state y (vector a b c)) ...))

然后我随机生成 1000 人。然后我使用上述功能对它们进行扫描和排名。如果我只是按原样扫描它们,已经需要很长时间了。如果我尝试将它们展平成这样的列表
(list x y a b c y a b c...)

还需要更多时间。这是展平函数:
(define (flatten-au au)
(match-define (automaton x states) au)
(define l (vector-length states))
(define body
(for/list ([i (in-range l)])
(match-define (state y z) (vector-ref states i))
(list y (vector->list z))))
(flatten (list x body)))

扫描功能看起来有点不同:
(define (scan population)
(foldl (lambda (auto a-hash) (hash-update a-hash (flatten-automaton auto) add1 0))
(hash)
population))

最佳答案

是的,我相信我看到了问题。您的算法有 O(n^2)(“n 平方”)运行时间。这是因为您是从 1 数到列表的长度,然后对每个索引执行 list-ref ,这花费的时间与索引的大小成正比。

这是 super 容易修复。

事实上,如果这是您想要的,真的没有理由对其进行排序或将其转换为列表;直接过滤哈希表即可。像这样...

#lang racket

(define A (build-list 1000000 (λ (idx) (random 50))))

(define (scan lst)
(foldl (lambda (element a-hash) (hash-update a-hash element add1 0))
(hash)
lst))

(define ht (scan A))

(define only-repeated
(time
(for/hash ([(k v) (in-hash ht)]
#:when (< 1 v))
(values k v))))

我将电话添加到 time看看需要多长时间。对于大小为 100 万的列表,在我的计算机上,这需要 1 毫秒的测量时间。

渐近复杂度很重要!

关于sorting - 使用哈希表在 Racket 中更快地排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34243239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com