📅  最后修改于: 2023-12-03 15:42:12.416000             🧑  作者: Mango
门(GATE)计算机科学(CS) 2020年问题17是一个纯计算机科学问题,涉及到离散数学和算法。该问题包含两个部分:第一部分要求学生实现一个伪随机数生成器(Pseudo-Random Number Generator) ,第二部分要求学生使用该伪随机数生成器实现一个快速排序算法(Quick Sort Algorithm)。
该部分要求学生实现一个伪随机数生成器,该生成器应该满足以下要求:
以下是一个基于线性同余法(Linear Congruential Generator)的伪随机数生成器的Python实现(代码片段使用markdown标识):
class RandomNumberGenerator:
def __init__(self, seed: int) -> None:
self.modulus = 2 ** 31
self.multiplier = 1103515245
self.increment = 12345
self.seed = seed
def rand(self) -> float:
self.seed = (self.multiplier * self.seed + self.increment) % self.modulus
return float(self.seed) / float(self.modulus)
该实现使用了反复迭代的线性同余法来生成随机数。其中,modulus
是模数,它应该是2的31次方;multiplier
是乘数,推荐使用1103515245;increment
是增量,推荐使用12345;seed
是初始种子值,用于产生第一个随机数。
该部分要求学生利用第一部分中的伪随机数生成器实现一个快速排序算法。以下是该算法的Python实现(代码片段使用markdown标识):
def quick_sort(arr: List[float], rng: RandomNumberGenerator) -> List[float]:
if len(arr) <= 1:
return arr
index = rng.rand() * len(arr)
pivot = arr[int(index)]
left = []
right = []
for i in range(len(arr)):
if i != int(index):
if arr[i] < pivot:
left.append(arr[i])
else:
right.append(arr[i])
return quick_sort(left, rng) + [pivot] + quick_sort(right, rng)
该实现使用了随机选择主元的快速排序算法,其中arr
是待排序的浮点数列表,rng
是伪随机数生成器。在该算法中,首先从列表中选择一个随机主元,然后将数组分成比主元小的左侧和比主元大的右侧两部分,接着递归地对两部分进行快速排序,最后合并排序后的部分即可。
以上即为GATE CS 2020问题17的详细解答。