【问题标题】:Scapegoat search function替罪羊搜索功能
【发布时间】:2019-05-05 19:08:43
【问题描述】:

我在替罪羊树中插入了 30000 个随机数。我有一个计数器来跟踪我的插入和搜索所做的比较。我试图搜索数字 3337,但没有找到,但跟踪器表示需要进行近 600 万次比较才能做出这个假设,这与 O(logn) 复杂度相差甚远。 这是我的搜索功能

/* Functions to search for an element */
        bool search(int val)
        {
            return search(root, val);
        }

        /* Function to search for an element recursively */
        bool search(SGTNode *r, int val)
        {
            bool found = false;
            while ((r != NULL) && !found)
            {
                cnt++;
                cnt++;
                int rval = r->value;
                if (val < rval){
                    cnt++;
                    r = r->left;
                }
                else if (val > rval){
                    cnt++;
                    cnt++;
                    r = r->right;
                }
                else
                {
                    cnt++;
                    cnt++;
                    found = true;
                    break;
                }
                found = search(r, val);
            }
            cnt++;
            cnt++;
            return found;
        }

我 100% 确定在调用 search 之前 cnt 计数器为 0。如果您需要更多我的代码,请随时询问。

【问题讨论】:

  • while 循环的目的是什么?看起来您正在混合使用递归和迭代方法。
  • 我把它改成了一个 if 并且确实我的计数急剧下降
  • 给你写了一个答案。

标签: c++ data-structures tree


【解决方案1】:

看起来您正在将递归和迭代方法混合到二进制搜索中。所以选择一个:

迭代方法(选我)

bool search(SGTNode *r, int val)
{
    while (r)
    {
        int rval = r->value;
        if (val < rval)
            r = r->left;
        else if (val > rval)
            r = r->right;
        else
            return true;
    }
    return false;
}

递归方法(别挑我,我只是好看):

bool search(SGTNode *r, int val)
{
    if(!r) // End the recursion if an element is not found
        return false;

    int rval = r->value;
    if (val < rval)
        return search(r->left,val);
    else if (val > rval)
        return search(r->right)
    else // Ends the recursion if an element is found
        return true;
}

根据需要添加counters

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 2021-11-21
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多