【问题标题】:mutidimension array with muti dimension data types in cc中具有多维数据类型的多维数组
【发布时间】:2014-02-01 21:37:21
【问题描述】:

我必须实现一个奇怪的数据结构。有一个队列,其中包含内存分配(它可能是队列或数组,但没有链表或任何在代码中使用 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)如何在这种情况下实现排序(但这是次要的事情,首先如何实现它?)(对不起,我在可以解决这个问题的主题上标记了这个问题,对此感到抱歉) 如果你不明白这个问题的任何内容,请不要犹豫,问我。

【问题讨论】:

    标签: c arrays sorting queue structure


    【解决方案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 的性能在已经大部分排序的数组上很差)。但这可能是我能想到的最直接的实现。


    1。实际上,听起来最简单的方法是使用诸如 C++、Java 或 Python 之类的语言,或者提供map 或类似容器的任何其他语言,键入您的sym 成员

    【讨论】:

    • 由于他不能使用 malloc,我假设他是嵌入式或类似的,在这种情况下,更高级别/解释性的语言可能是不可能的。
    • @John Bode 实际上我不需要删除任何东西。我必须增加内存块的大小来保留所有先前的元素以及通过添加两个最小元素获得的元素(我只是必须通过移动新获得元素所在位置右侧的元素来调整新获得的元素。在我们的例子中,“a,3,0,0”“b,3,0,0”将保持在它的位置,而 "c,6,0,0" 和它的右侧部分将移动 1 个位置。 uoi 有解决方案吗?
    • qsort 将为您处理 - 将数组和比较函数传递给它,它会根据需要在数组周围移动元素。
    • @GreenAsJade 你是对的,但你知道我不必删除数组中的任何内存(即使我必须为每次添加添加一个内存),好的,我解释一下:(我只需要频率解释的时刻):我有:3,3,4,6,9 我添加了两个节点,但我还必须将这两个添加的节点保存在内存中,这里是 3+3,所以下一次执行必须给出我:3,3,4,6,6,9(请参阅此处我们将前 3,3 保留在内存中,并为通过添加 3,3=6 获得的结果增加了 1 个内存)。所以当我应用 qsort再次在同一个数组上,它将再次找到重复的最小两个(再次是 3,3)
    • @user3085082:这就是我添加dataSize 变量的原因;它告诉你数组中有多少元素正在使用中。
    【解决方案2】:

    我认为您不妨声明一个由 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]
    

    然后,您只需要一个排序算法,它对节点数组进行操作,并使用每个节点的频率元素作为比较的基础。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-10
      • 2021-02-26
      • 2021-05-20
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多