我怎么知道计数器增量是不是在正确的位置以跟踪比较数~C++?
Posted
技术标签:
【中文标题】我怎么知道计数器增量是不是在正确的位置以跟踪比较数~C++?【英文标题】:How would I know if the counter increments are at the correct place to keep track the # of comparisons ~ C++?我怎么知道计数器增量是否在正确的位置以跟踪比较数~C++? 【发布时间】:2016-04-15 09:54:56 【问题描述】:// 问题已解决。我对在哪里添加计数器以报告数量感到困惑 比较。它总是保持在一个固定的数字,永远不会改变。假设每次程序运行时向量都包含两位随机数。 //
编辑:新问题。我不确定计数器增量是否在正确的位置用于插入排序和选择排序。 代码粘贴在安全链接: http://ideone.com/Bk90du
int insertionSort(vector<int> &v)
// Variables
int temp, i, j, counter;
counter = 0;
for (i = 1; i < v.size(); i++)
temp = v[i];
j = i-1;
while(temp < v[j] && j >= 0)
v[j+1]=v[j];
j--;
counter++; // tracking # of comparisons.
v[j+1]=temp;
return counter; // return counter
【问题讨论】:
我认为错误在其他地方,这应该可以。 什么样的错误? @alain 如何用值填充输入向量?您是否正确播种了随机数生成器? 对我的问题进行了一些修改,感谢您的意见和专业知识。 【参考方案1】:根据(现已删除的)评论,这是main()
:
int main()
int numCount;
vector<int> myVector2(myVector);
insertionSort(myVector2);
cout << endl << endl;
cout << "Vector after Insertion Sort: ";
printVector(myVector2);
cout << endl << endl;
numCount = insertionSort(myVector2);
cout << "Number of comparisons: " << numCount;
您对同一个向量进行两次排序,并打印第二次排序运行的比较计数。当向量已经排序后,比较的次数就等于向量中的元素个数,因为不需要做任何工作。
要获得真实的比较次数,请将您的 main()
更改为:
int main()
int numCount;
vector<int> myVector2(myVector);
numCount = insertionSort(myVector2);
cout << endl << endl;
cout << "Vector after Insertion Sort: ";
printVector(myVector2);
cout << endl << endl;
cout << "Number of comparisons: " << numCount;
【讨论】:
我有一个问题,关于反向向量的比较。他们很少改变,如果他们真的改变了,那只是很小的区别。假设会发生这种情况吗?但是,对于 myVector 和 myVector2 的原始向量,我让它们都可以工作,感谢您的评论:) 反向向量也是排序的,但是是反向的,所以是的,我会说大多数时候比较次数相同是正常的。当存在重复元素时,可能会出现(小)差异。 我不确定计数器增量是否在正确的位置。【参考方案2】:如果不知道您的测试用例是什么,就无法评论它们执行的比较次数。如果所有案例都具有相似的属性,那么代码很有可能表现得应该如此。
编辑:添加以下内容以响应 OP 在 cmets 中声称测试用例是具有 100 个随机生成的两位数元素的向量。
如果,正如您在 cmets 中所说,您的测试用例涉及具有 100 个随机两位值的向量,那么 counter
的值将取决于元素的“未排序”程度(最小值可能与元素的数量)。假设所有测试用例的大小都相同,那么 counter
的值相同的唯一方法是在调用函数之前对向量进行类似排序。例如,如果所有向量都按升序和相同大小预先排序,则每个测试用例都会给出完全相同的返回值。同样,如果所有向量都按降序和相同大小预先排序,则每个测试用例都会给出完全相同的返回值(尽管与最初按升序排列的返回值不同)。
因此,我不相信您关于测试用例是随机的评论。它们可能以某种方式预先排序(或部分排序)。例如,您可能会为每个测试用例调用您的函数两次,并且仅在第二次调用后打印出count
的值.....当向量(如果您的代码表现得如此)已经预先排序。
结束编辑
也就是说,代码中的变量counter
正在累积执行while
循环体的次数。这与正在执行的比较次数无关,因为在该循环的主体中没有执行比较。它与插入次数有关,与比较次数无关。
如果通过“比较”,您想要评估表达式 temp < v[j]
(与其他表达式不同,例如 i < v.size()
或 j >= 0
,在您的代码中也可以称为比较),那么您可以考虑这样做像
while (++counter && temp < v[j] && j >= 0)
并从循环体中删除 counter
的增量。
由于counter
被初始化为零,这将计算temp < v[j]
被评估的次数(++counter
将始终产生非零结果)。请注意,由于temp < v[j]
可以为假,因此不会计算j >= 0
的计算次数。
【讨论】:
测试用例为:一个向量有100个随机的两位数,插入排序函数会将这些数字升序排序。计数器在函数中递增,因此它可以返回它进行的比较次数。 是的,好的。我已经编辑了我的答案,以回应您在这里的要求。不知何故,我怀疑您的测试用例实际上是随机的。但解释太长,无法发表评论。以上是关于我怎么知道计数器增量是不是在正确的位置以跟踪比较数~C++?的主要内容,如果未能解决你的问题,请参考以下文章