Algorithm 在链表中查找元素

Algorithm 在链表中查找元素,algorithm,linked-list,computer-science,Algorithm,Linked List,Computer Science,有一个数据结构为迭代器提供以下接口: struct iterator { T value(); void next(); bool isValid(); } 您将如何设计一个算法,在循环结束时以相同的概率为每个元素从列表中返回一些值?列表可以很长,所以列表的长度不能用int或long表示。无法修改该列表 有什么想法吗? 谢谢。您不知道列表的长度,因此必须一直迭代到最后。您需要保留当前所选项目值(或项目)的副本,但在您的问题中似乎没有办法这样做。然后,对于迭代到的每一个新

有一个数据结构为迭代器提供以下接口:

struct iterator {
    T value();
    void next();
    bool isValid();
}
您将如何设计一个算法,在循环结束时以相同的概率为每个元素从列表中返回一些值?列表可以很长,所以列表的长度不能用int或long表示。无法修改该列表

有什么想法吗?
谢谢。

您不知道列表的长度,因此必须一直迭代到最后。您需要保留当前所选项目值(或项目)的副本,但在您的问题中似乎没有办法这样做。然后,对于迭代到的每一个新项目,您都需要确定所选项目是否应该保留或更改,并降低概率

由于您声明列表的长度可能不适合本机/原始数据类型(我假设您的意思是,当您谈论
int
long
,它们是编程语言,甚至是特定于方言的数据类型,并且您没有指定编程语言),我认为您的意思是列表可能任意长。所以你需要一个bignum库,它可以给你任意的随机数

伪代码:

T current = empty value
bignum index = 0
iterator = first item of list
while iterator.isValid()
    index = index + 1
    if bignum_random_below(index) == 0
        # 0 is interpreted as, take value from current index,
        # everything else is interpreted as keep the previous value
        current  = iterator.value()
    end if
    iterator.next()
end while
# index value 0 indicates empty list, even if T doesn't have empty value

来自Moehm的评论:这被称为。

你不知道列表的长度,所以你必须一路迭代到最后。您需要保留当前所选项目值(或项目)的副本,但在您的问题中似乎没有办法这样做。然后,对于迭代到的每一个新项目,您都需要确定所选项目是否应该保留或更改,并降低概率

由于您声明列表的长度可能不适合本机/原始数据类型(我假设您的意思是,当您谈论
int
long
,它们是编程语言,甚至是特定于方言的数据类型,并且您没有指定编程语言),我认为您的意思是列表可能任意长。所以你需要一个bignum库,它可以给你任意的随机数

伪代码:

T current = empty value
bignum index = 0
iterator = first item of list
while iterator.isValid()
    index = index + 1
    if bignum_random_below(index) == 0
        # 0 is interpreted as, take value from current index,
        # everything else is interpreted as keep the previous value
        current  = iterator.value()
    end if
    iterator.next()
end while
# index value 0 indicates empty list, even if T doesn't have empty value

来自Moehm的评论:这被称为。

你不知道列表的长度,所以你必须一路迭代到最后。您需要保留当前所选项目值(或项目)的副本,但在您的问题中似乎没有办法这样做。然后,对于迭代到的每一个新项目,您都需要确定所选项目是否应该保留或更改,并降低概率

由于您声明列表的长度可能不适合本机/原始数据类型(我假设您的意思是,当您谈论
int
long
,它们是编程语言,甚至是特定于方言的数据类型,并且您没有指定编程语言),我认为您的意思是列表可能任意长。所以你需要一个bignum库,它可以给你任意的随机数

伪代码:

T current = empty value
bignum index = 0
iterator = first item of list
while iterator.isValid()
    index = index + 1
    if bignum_random_below(index) == 0
        # 0 is interpreted as, take value from current index,
        # everything else is interpreted as keep the previous value
        current  = iterator.value()
    end if
    iterator.next()
end while
# index value 0 indicates empty list, even if T doesn't have empty value

来自Moehm的评论:这被称为。

你不知道列表的长度,所以你必须一路迭代到最后。您需要保留当前所选项目值(或项目)的副本,但在您的问题中似乎没有办法这样做。然后,对于迭代到的每一个新项目,您都需要确定所选项目是否应该保留或更改,并降低概率

由于您声明列表的长度可能不适合本机/原始数据类型(我假设您的意思是,当您谈论
int
long
,它们是编程语言,甚至是特定于方言的数据类型,并且您没有指定编程语言),我认为您的意思是列表可能任意长。所以你需要一个bignum库,它可以给你任意的随机数

伪代码:

T current = empty value
bignum index = 0
iterator = first item of list
while iterator.isValid()
    index = index + 1
    if bignum_random_below(index) == 0
        # 0 is interpreted as, take value from current index,
        # everything else is interpreted as keep the previous value
        current  = iterator.value()
    end if
    iterator.next()
end while
# index value 0 indicates empty list, even if T doesn't have empty value

来自Moehm的评论:这被称为。

[0,length)
然后移动到下一个元素多次,并返回您到达的元素?我们不知道长度。我们只能迭代列表,一次发现迭代器无效,样本大小为1:选择概率为1的第一项。如果列表已用尽,则您现在选择了唯一的项。否则,选择概率为1/2的下一项。如果列表已用尽,则您已选择概率为1/2的两项中的一项。选择概率为1/3的下一项。依此类推。谢谢!这似乎是我一直在寻找的!在
[0,length)
然后移动到下一个元素多次,并返回您到达的元素?我们不知道长度。我们只能迭代列表,一次发现迭代器无效,样本大小为1:选择概率为1的第一项。如果列表已用尽,则您现在选择了唯一的项。否则,选择概率为1/2的下一项。如果列表已用尽,则您已选择概率为1/2的两项中的一项。选择概率为1/3的下一项。依此类推。谢谢!这似乎是我一直在寻找的!在
[0,length)
然后移动到下一个元素多次,并返回您到达的元素?我们不知道长度。我们只能迭代列表,一次发现迭代器无效,样本大小为1:选择概率为1的第一项。如果列表已用尽,则您现在选择了唯一的项。否则,选择概率为1/2的下一项。如果列表已用尽,则您已选择概率为1/2的两项中的一项。选择概率为1/3的下一项。依此类推。谢谢!这似乎是我一直在寻找的!在
[0,length)
然后移动到下一个元素多次,并返回您到达的元素?我们不知道长度。我们只能迭代列表,一次发现迭代器无效,样本大小为1:选择概率为1的第一项。如果列表为exh