Data structures 编程和数据结构
假设给定的数组p[1……N]和q[1……N]都未初始化,即每个位置可能包含一个任意值),以及一个初始化为0的变量计数。考虑下面的程序集和ISHOSET:Data structures 编程和数据结构,data-structures,Data Structures,假设给定的数组p[1……N]和q[1……N]都未初始化,即每个位置可能包含一个任意值),以及一个初始化为0的变量计数。考虑下面的程序集和ISHOSET: set(i) { count = count + 1; q[count] = i; p[i] = count; } is_set(i) { if (p[i] ≤ 0 or p[i] > count) return false; if (q[p[i]] ≠ i)
set(i) {
count = count + 1;
q[count] = i;
p[i] = count;
}
is_set(i) {
if (p[i] ≤ 0 or p[i] > count)
return false;
if (q[p[i]] ≠ i)
return false;
return true;
}
表明如果集合(i)没有被某些i调用,那么不管p[i]包含什么,is_集合(i)都将返回false
我的推理:-是_集(i)
如果p[i]为0,那么我们知道计数为零,因此第一个If中的第二个条件将为真。因此,无论p[i]可能包含什么,它都将始终输入该If并返回false。如果错误,请更正我。如果未设置
i
,则p[i]
可能包含任何可能的值,可能低于0或高于count
,但它有可能包含这两者之间的一个可能值。因此,如果确实如此,我们需要检查第二个if语句p[i]
包含您设置的i
顺序中的位置,因此当然,q[p[i]
应该等于i
,因为q[]
是存储时间顺序中的i
值的数组。因此,如果没有设置i
,则p[i]
将存储不同数字的位置,因此q[p[i]
将返回一个不同于i
的数字,该数字将被设置在该位置,设置(i)
对于某些i
未被调用的确切含义是什么?它的意思是“对于每个i
都没有调用set(i)
”还是说“有一个i
没有调用set(i)
”?你推理中唯一的错误是,你假设任意值超出了你的范围,但一个任意值确实是,信不信由你,任意的,所以它实际上可能在这些界限之间。当然,如果你有一个小的N,几率是非常低的,但是让我们假设N=2000000000
,它更接近最大整数值。现在机会有多大?你需要考虑每一个possibility@Codor老实说,这很容易理解。您可以调用set(1)
,set(2)
,set(3)
和set(5)
。set(i)
是否未为某些i
调用?是的,例如,对于i=4
,或i=6
,或i=1000000
…如果未设置i
,则p[i]
可能包含任何可能的值,可能低于0或高于count
,但它可能包含这两者之间的可能值。因此,如果确实如此,我们需要检查第二个if语句p[i]
包含您设置的i
顺序中的位置,因此当然,q[p[i]
应该等于i
,因为q[]
是存储时间顺序中的i
值的数组。因此,如果没有设置i
,则p[i]
将存储不同数字的位置,因此q[p[i]
将返回一个不同于i
的数字,该数字将被设置在该位置,设置(i)
对于某些i
未被调用的确切含义是什么?它的意思是“对于每个i
都没有调用set(i)
”还是说“有一个i
没有调用set(i)
”?你推理中唯一的错误是,你假设任意值超出了你的范围,但一个任意值确实是,信不信由你,任意的,所以它实际上可能在这些界限之间。当然,如果你有一个小的N,几率是非常低的,但是让我们假设N=2000000000
,它更接近最大整数值。现在机会有多大?你需要考虑每一个possibility@Codor老实说,这很容易理解。您可以调用set(1)
,set(2)
,set(3)
和set(5)
。set(i)
是否未为某些i
调用?是,例如,对于i=4
,或i=6
,或i=1000000
。。。