【问题标题】:Is there strong reason not to include multiple node pointers in a node to use in more than one data structure?是否有充分的理由不在一个节点中包含多个节点指针以用于多个数据结构?
【发布时间】:2011-03-09 18:33:52
【问题描述】:

以我正在处理的任务为例。我们将使用二叉搜索树来查找一组数据中的一部分,然后使用链表查找该组中的另一部分。教授建议的方法是:

struct treeNode
{
    data * item;
    treeNode *left, *right;
};

struct listNode
{
    data * item;
    listNode *next, *prev;
};

class collection
{
public:
         ........
}

其中 data 是包含每条记录的详细信息的类。很明显,既然设置好了,treeNode就不能存在于链表中。

这样会不会更简单:

struct node
{
    data * item;
    node *listNext, *listPrev, *treeLeft, *treeRight;
};

然后我们可以声明:

node * listHead;
node * treeRoot;

并将两种插入算法都包含在类中。

我有什么遗漏吗?

【问题讨论】:

    标签: c pointers data-structures binary-search-tree


    【解决方案1】:

    实际上,数据项将被插入到两个列表中。分配的(普通)目的是在集合中的两个不同元素中对数据集进行排序。

    这么说,我不是在节省内存吗?结合 2 个节点,我最终得到 5 个指针,如果我将它们分开,我将使用 6 个。而且我真的只有这样一组数据。如果我有 250 个数据项要跟踪,我将拥有一组 1250 个指针,而不是 2 个 750 个列表。也许我误解了指针调用实际分配的内容。

    【讨论】:

      【解决方案2】:

      你可以这样做,但是你用额外的指针浪费了内存。此外,混合这样的类型往往会更令人困惑。我是否正确假设数据要么放入列表或放入树中,但没有插入两者?如果它们是不同的数据类型,真的没有太多理由让它们都使用相同的结构。如果您将相同的数据插入到这两种类型中,如果您对此类操作有任何用途,则可能会从遍历树切换到遍历列表。

      由于您将数据插入到两个列表中,因此使用复合节点结构可以节省内存。我会先插入二叉树,然后将分配的节点插入到链表中。你不会真的得到一个纯链表或二叉搜索树,但它可以像任何一个一样被遍历。

      【讨论】:

        【解决方案3】:

        答案是什么?

        如果您的数据小于 (hmmm) 兆字节,请不要担心内存消耗。 1 或 2 GB 在当今的普通计算机中很常见。

        这些物品有多大? 32个字符? 64k 压缩多媒体?有什么大不了的?

        同时使用这两种技术来组织一个项目的合理性如何?如果数据确实相同,那么 5 指针结构很有趣——有人可以以一种顺序找到一个节点,然后以另一种顺序浏览相关节点。

        这些项目是无关的吗,一些粉笔,一些奶酪?它们是多维的吗?人事记录?音频文件说明?食谱?

        在学校里,一位优秀的老师会努力让你在常用技术和学科方面获得经验。就像艺术课或作曲一样。铅笔,粉彩,5 段文章。所以老师可能希望你写两个不同的类和构造函数。对一部分数据使用一个结构,对其他数据使用不同的结构。或者一样。只是因为。

        在学校之外,数据以某种格式出现,并且对其/带有所需的操作。 “用例”是关于如何使用数据、必须保留什么、使用什么算法的故事。

        这点可能是双峰搜索,2对正交指针。它可能是联合,其中每个项目都与列表或树相关联,但不能同时与两者相关联。它可能是一系列轻量级的子集、树和列表,它们被比较和对比......

        如有疑问,“数据结构 + 算法 = 程序”。但是了解老师试图提出的观点以及您是否想跟随他们的领导是值得的。 (通常,在学校,你会这样做。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-13
          • 2023-03-16
          • 1970-01-01
          • 2018-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多