我必须实现一个奇怪的数据结构。有一个队列,其中包含内存分配(可能是队列或数组,但没有链接列表或代码中使用malloc()的任何内容)。 我们必须使用这个机构: -
Struct //we don't have to use pointer in structure in achieving the task
{
int frequency;
unsigned char symbol;
short int left,right;
}
在这里你可以看到我们在第一个索引处有a,b,c,d和e这样的字母表,在第二个索引上有相应的频率,而另外两个索引暂时没用,但是我们必须为他们现在。
现在只对我们有用的东西只是第二个索引(这是字母表的频率)。我在这个问题中要做的就是两个添加两个最小频率(我必须把它放在一个地方,以便必须保持增加的顺序)例如:你可以看到下面我们添加前两个节点的频率:所以对于第一个索引我们得到“a + b”的结果,让我们说“z”(a + b = z)和第二个索引(3 + 3 = 6),另外两个索引是“0”和“0”,所以对我们没用。我们现在必须调整这个获得的记忆,使其保持频率增加的顺序
现在的问题是: (1)任何想法如何实现这种类型的数据结构? (不使用指针,malloc(),链表等)(但可以使用队列/堆栈),而且我们可以使用memcpy()进行移位。 (2)如何在这种情况下实现排序(但它是次要的,首先是如何实现它?)(很抱歉,我正在对可以解决这个问题的主题标记这个问题,对不起) 如果你对这个问题一无所知,请不要犹豫我。
答案 0 :(得分:1)
我认为你也可以声明一个包含26个结构的数组,因为看起来每个字母只能有一个条目,不再有
struct counting_thing //we don't have to use pointer in structure in achieving the task
{
int freq;
unsigned char sym;
short int left,right;
}
struct counting_thing ordered_things[25]; // one entry for each letter [a-z]
然后,您只需要一个在节点数组上运行的排序算法,并使用每个节点的freq元素作为比较的基础。
答案 1 :(得分:1)
这种结构主要用于搜索或存储吗?你会不断添加和删除元素,还是会保持相当静态?
假设我理解了这个问题(不保证),听起来像最简单的方法是使用struct
类型的常规数组 1 :
struct afreq {
int freq;
unsigned char sym; // why unsigned? why not just plain char?
short int left,right;
};
...
struct afreq data[N]; // where N is large enough for as many elements
// as you need
size_t dataSize;
使用qsort
库函数根据需要对数组进行排序。您必须编写一个比较函数以传递给qsort
:
int cmpAfreq( const void *lhs, const void *rhs )
{
const struct afreq *l = lhs;
const struct afreq *r = rhs;
if ( l->freq < r->freq ) return -1;
if ( l->freq > r->freq ) return 1;
return 0;
}
所以,假设您从以下内容开始:
struct afreq data[N] = { {3, 'a', 0, 0 }, {3, 'b', 0, 0}, {4, 'c', 0, 0 },
{6, 'd', 0, 0 }, {9, 'e', 0, 0} };
size_t dataSize = 5;
你可以像这样添加一个新元素:
struct afreq newItem;
newItem.freq = data[i].freq + data[j].freq;
newItem.sym = 'z';
newItem.left = newItem.right = 0;
if ( dataSize < N )
{
data[dataSize++] = newItem;
qsort( data, dataSize, sizeof data[0], cmpAfreq );
}
else
{
// data array is full, can't add another element
}
要从数组中删除元素,可以用最后一个元素覆盖要删除的元素,将计数器减1,然后重新排序数组:
data[i] = data[dataSize--];
qsort( data, dataSize, sizeof data[0], cmpAfreq );
这绝不是高效;每次添加或删除数据时必须完全重新排序数组将是昂贵的(特别是因为qsort
在已经大部分排序的数组上的性能很差)。但这可能是我能想到的最直接的实现。
map
或类似容器的其他任何东西,键入你的{{1成员