【问题标题】:hack insertion sort to make it work differently破解插入排序以使其工作方式不同
【发布时间】:2021-08-03 19:18:45
【问题描述】:

下面是插入排序的原始伪代码:

function INSERTIONSORT(A[0..n−1])
for i←1 to n−1 do 
    j←i−1 
    while j≥0 and A[j+1]<A[j] do 
          SWAP(A[j+1],A[j]) 
          j←j−1

一家公司正在其产品中使用插入排序。您是该公司聘请的网络安全专家,负责评估其代码的任何安全漏洞。经过几次尝试,您成功地攻击了他们的插入排序代码,并通过以下方式对其进行了修改(在下面的伪代码中以粗体蓝色显示):

function INSERTIONSORT(A[0..n−1])
         for i←1 to n−1 do
         j←i−1 
         while j≥0 and HASH(A,j+1) < HASH(A,j) do 
               SWAP(A[j+1],A[j])
               j←j−1

换句话说,不是在“while”条件中将数组索引为 A[j] 和 A[j+1],而是现在有一个哈希函数,它将数组和索引作为参数并返回一个整数。你的工作是实现特定的散列函数,这些函数会以不同的方式导致算法出现故障。

  • 实现一个散列函数,使插入排序保持原始数组不变。解释您的解决方案为何有效。
  • 实现一个散列函数,使插入排序始终在最坏情况下运行,即使结果数组最终没有排序。解释您的解决方案为何有效。
  • 实现一个散列函数,使插入排序对数组进行反向排序。解释您的解决方案为何有效。

我不知道这个问题。

【问题讨论】:

    标签: algorithm function hash


    【解决方案1】:

    由于这显然是家庭作业,我将把这个答案限制为一个提示:
    对于前两种情况,请考虑一个数组,以便原始插入排序实现显示请求的行为(我们称该数组为A')。现在您可以查找函数HASH,这样HASH(A, j + 1) &lt; HASH(A, j) 显示的行为与A'[j + 1] &lt; A'[j] 完全相同。如果你设法解决了前两个,最后一个应该很明显。

    【讨论】:

    • 嗨,我认为a和b是hash(A,j)=j和hash(A,j)=-j,但我不知道c的答案是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2021-05-10
    相关资源
    最近更新 更多