问题标签 [quickselect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
58255 浏览

algorithm - QuickSelect算法理解

我一直在研究各种讨论快速排序和快速选择的教程和文章,但是我对它们的理解仍然不稳定。

鉴于这种代码结构,我需要能够掌握并解释 quickselect 的工作原理。

在分解成伪代码方面我需要一点帮助,虽然我没有获得分区函数代码,但我想了解它会在提供的快速选择函数的情况下做什么。

我知道快速排序是如何工作的,只是不知道快速选择。我刚刚提供的代码是我们获得的关于如何格式化快速选择的示例。

编辑:更正的代码是

礼貌:@海涛

0 投票
1 回答
3801 浏览

algorithm - 使用重复值快速选择

是否可以在多集(值可以重复)上在 O(n) 中执行搜索第 k 个元素?

因为据我了解快速选择的想法,我必须使用一些枢轴对输入进行分区。然后我有 2 个数组,我选择用于递归搜索取决于我正在搜索的索引元素 + 两个数组的大小,例如:

1 7 8 5 3 2 4

假设枢轴是 4 我正在搜索第二大元素。所以分区后我可能会得到类似的订单

1 3 2 4 7 8 5

因为右子数组由 3 个元素组成,如果我是正确的,我仍然会尝试在右数组中找到第二大元素?

但是,如果我以 8 作为支点,我可能会得到类似的东西

1 3 2 7 5 4 8

因此我会尝试在左表中找到最大的元素(可能是线性的,但通常我会采用左子数组并搜索元素 - (|右子数组大小| + 1))

但是多集呢?假设我有数组:

4 5 6 7 7 7 4 3 2 1

我的支点是 6 搜索第三大元素,分区后我收到:

4 5 3 2 4 1 6 7 7 7

所以如果我使用上面介绍的方法,我将尝试在右子数组上执行递归,而很明显第三个最大值是左边的 5?

我想出的唯一解决方案是使用一些数据结构(如 BST、Set 等)来 O(nlogn) 过滤掉重复项。然后使用 O(n) 快速选择。但是总的来说,它会给我非线性方法,这可以线性完成吗?


我还有一个额外的问题,如果无法分配内存怎么办?我能做的就是只使用本地整数+堆栈递归。这个问题可以在 O(n) 中解决吗?因为 O(nlogn) 可以通过排序 + 线性“通过计数”来完成。

0 投票
1 回答
534 浏览

python - 基于 Python 的快速选择实现导致错误

我有实现这里讨论的快速选择的小型 python 代码。

我似乎遇到了一个随机错误。有什么事吗?

编辑:实施random.choice而不是random.randint. 上面的代码似乎工作正常。感谢用户搅拌机。

0 投票
1 回答
542 浏览

c++ - 没有额外内存分配的 C++ 中的 QuickSelect 实现

如果你不介意,我有一点功课帮助。基本上这个想法是对一组值执行快速选择,但是我们得到了一个模板,我似乎无法弄清楚如何让这些函数与所提供的内容一起工作。

问题是这些值不会正确排列,或者如果它们排列正确,它们会在每次输入相同的值时发生变化。

这是我正在使用的函数,我将在代码之后用 /**/ 表示我编写的代码,任何其他行都是为我提供的模板的一部分。

我的“test.txt”文件包含以下值:

对此的任何帮助将不胜感激。我的教授根本没有解释这将如何工作,我在网上找到的任何其他示例都不能回答我的问题。我花了很多时间摆弄不同的实现方式,此时我只是不知道。谢谢

编辑:更改,现在可以直接实现和编译。还添加了我正在使用的库

0 投票
1 回答
2672 浏览

c++ - 找到数组中第 K 个最大的 int

我正在尝试在 C++ 中使用 quickselect 来执行此操作,但它不断返回我第 k 个最小的元素而不是第 k 个最大的元素。我的逻辑哪里错了?

我应该改变什么来使这个第 k 个最大而不是第 k 个最小的元素?

0 投票
1 回答
961 浏览

c++ - 我的快速选择算法没有返回正确的值

所以我试图在 C++ 中实现一个快速选择算法,以便在向量中找到中值,但是它没有正确地对列表进行部分排序,也没有返回正确的中值。

我似乎找不到错误在哪里。我是这个算法的新手,这是我第一次尝试实现它。我在下面包含了我的代码,所以如果比我更博学的人对出了什么问题有任何想法,我将非常感谢您的意见。

0 投票
2 回答
1214 浏览

python - Python快速选择不打印/返回枢轴

这是快速选择的代码

我遇到的问题是它运行时没有错误或任何东西,但是当它自己完成时,我希望它向 python shell 输出一些东西(在这种特定情况下是列表的中位数),但我什么也没得到. 我在这里做错了吗?

至于我为 lst 和 k 输入的内容......

  • lst = [70, 120, 170, 200]
  • k = len(lst) // 2

我也尝试了一些不同的 k 值,但无济于事

0 投票
1 回答
67 浏览

python - 如果 pivot 不是中间项,quickselectg 的行为会有什么不同

好的,所以我开发了一个通用的快速选择函数,它用于查找列表的中位数。

那么,如果枢轴每次都从列表的第一项开始,程序的行为会有什么不同。我必须把它放在中心吗?另外,我应该从哪里开始 time.clock() 以查找函数的经过时间。这是代码

0 投票
1 回答
959 浏览

python - Python:未排序/排序列表返回不同的值?

在做一些事情时,我遇到了一个奇怪的问题,我无法弄清楚。我以两种方式对包含 10,000 个值的列表进行排序,一种使用快速选择,另一种使用插入排序。这样做的目标是找到一个中值,然后使用所述中值我必须找到中值和所有值之间的总距离。中位数计算工作得非常好,但由于我无法理解的原因,总计算返回不同的值。计算总数的函数的输入是列表和中位数。两个程序之间的中位数保持不变,列表的值也一样,但是其中一个列表已排序,而另一个列表未排序。

这是我用来计算总数的内容(对此的格式很好,它只是复制到这里很奇怪)......

一个列表被排序而另一个列表没有被排序,为什么我会得到截然不同的值?作为参考,我在使用插入排序时得到的距离是 49846.0,但在使用快速选择时得到的距离是 29982

0 投票
1 回答
1134 浏览

python - Python- Quickselect function finding the median

So I have developed the code for a quick select function but it doesn't seem to be printing out the median. I have the main function prompt for a file name and then import that txt file, split it up into a list of numerals this is the txt file:

It gets imported into a list:

when it runs through the quickselect function it prints out the elapsed time being an odd number that changes every time something like 1.9083486328125e-06... first off what value of time is this in milliseconds? and when the function runs and returns the pivot it spits out this:

Can someone tell me why it isn't working? this is the code: