1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
4.5 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "Benchmark.h"
#include "SeqList.h"
#include "Utilities.h"
#include <algorithm>
#include <cstdio>
#include <new>
void __print_result_line(FILE *fp, int rep, int sz, double ms, int cmp, int mov, int mem)
{
fprintf(fp,
"对长度为 %d 的线性表运行 %d 次所耗费的总时间为:%.6lf ms, 元素移动总次数: %d, 元素值比较总次数: %d, 辅助空间总字节数: %d\n",
sz, rep, ms, cmp, mov, mem);
fprintf(stdout, "对长度为 %d 的线性表运行 %d 次所耗费的总时间为:%.6lf ms\n", sz, rep, ms);
}
void benchmark_hw2_1(int mn, int mx, int stp, int rep)
{
/*
在SeqList.h中编写OrderInsert()函数。
OrderInsert()函数实现在有序顺序表中
按数据元素非递减的顺序插入一个数据元素item
使得L中的数据元素按值非递减有序序列。
*/
using TList = SeqList<int>;
using TPList = TList *;
Random rnd;
Timer timer;
int *nums = new int[1ll * mx * rep];
if (!nums) __error_then_exit("Memory alloc failed.");
FileHandleExitOnFail fp("benchmark_hw2_1.txt", "w");
for (int sz = mn; sz <= mx; sz += stp)
{
int idx = sz * rep;
while (--idx >= 0) nums[idx] = rnd.next();
TPList lists = (TPList)malloc(sizeof(TList) * rep);
for (int i = 0; i < rep; i++) new (lists + i) TList(sz);
timer.start();
for (int i = 0; i < rep; i++)
{
auto list = lists + i;
for (int j = 0; j < sz; j++)
list->OrderInsert(nums[++idx]);
}
timer.stop();
for (int i = 0; i < rep; i++)
{
auto list = lists + i;
for (int j = 1, x, y; j < sz; j++)
{
list->getData(j, x);
list->getData(j + 1, y);
if (x > y) __error_then_exit("Wrong answer! Not a ordered list.");
}
}
int cmp_sum = 0, mov_sum = 0, mem_sum = 0;
for (int i = 0; i < rep; i++)
{
cmp_sum += lists[i].counter.get_cmp();
mov_sum += lists[i].counter.get_mov();
mem_sum += lists[i].counter.get_mem();
}
for (int i = 0; i < rep; i++) lists[i].~SeqList();
free(lists);
__print_result_line(fp, rep, sz, timer.diff_in_ms(), cmp_sum, mov_sum, mem_sum);
}
delete[] nums;
}
void benchmark_hw2_3(int mn, int mx, int stp, int rep)
{
/*
在SeqList.h中编写MoreRemoveT &x函数。
顺序表中可能有重复的x值。
MoreRemoveT &x函数实现在有序顺序表中删除所有值为x的元素。
尽可能算法高效,考虑减少元素移动的次数。
*/
using TList = SeqList<int>;
using TPList = TList *;
using TView = Array2DView<int>;
Random rnd;
Timer timer;
int *nums = new int[1ll * mx * rep];
if (!nums) __error_then_exit("Memory alloc failed.");
FileHandleExitOnFail fp("benchmark_hw2_3.txt", "w");
for (int sz = mn; sz <= mx; sz += stp)
{
int idx = sz * rep;
int vmin = 0, vmax = log2(sz) + 1;
while (--idx >= 0) nums[idx] = rnd.next(vmin, vmax);
TView nums_view(sz, nums);
int *rm = new int[rep];
for (int i = 0; i < rep; i++)
rm[i] = *nums_view[i], std::sort(nums_view[i], nums_view[i + 1]);
TPList lists = (TPList)malloc(sizeof(TList) * rep);
for (int i = 0; i < rep; i++) new (lists + i) TList(sz);
for (int i = 0; i < rep; i++)
{
for (int j = 0; j < sz; j++)
lists[i].Insert(j, nums_view[i][j]);
lists[i].counter.reset();
}
timer.start();
for (int i = 0; i < rep; i++)
lists[i].MoreRemove(rm[i]);
timer.stop();
int cmp_sum = 0, mov_sum = 0, mem_sum = 0;
for (int i = 0; i < rep; i++)
{
cmp_sum += lists[i].counter.get_cmp();
mov_sum += lists[i].counter.get_mov();
mem_sum += lists[i].counter.get_mem();
}
for (int i = 0; i < rep; i++)
{
TPList list = lists + i;
int len = remove(nums_view[i], nums_view[i + 1], rm[i]) - nums_view[i];
if (list->Length() != len)
__error_then_exit("Wrong answer! Not removing correctly.");
for (int j = 1, x; j <= list->Length(); j++)
{
list->getData(j, x);
if (x != nums_view[i][j - 1])
__error_then_exit("Wrong answer! Not removing correctly.");
}
}
for (int i = 0; i < rep; i++) lists[i].~SeqList();
free(lists);
__print_result_line(fp, rep, sz, timer.diff_in_ms(), cmp_sum, mov_sum, mem_sum);
}
delete[] nums;
}