小编tem*_*def的帖子

在二叉搜索树上实现迭代器

最近我一直在编码了一堆不同的二叉搜索树实现(AVL,扇,树堆),并很好奇,如果有一个特别"好"的方式来写一个迭代器遍历这些结构.我现在使用的解决方案是让BST中的每个节点都存储指向树中下一个和前一个元素的指针,这会将迭代减少到标准的链表迭代.但是,我对这个答案并不满意.它通过两个指针(下一个和前一个)增加每个节点的空间使用量,在某种意义上它只是作弊.

我知道的构建,通过使用堆栈跟踪前沿节点的探索以后用0-1(H)的辅助存储空间(其中,h为树的高度),二叉搜索树迭代器的方式,但我由于内存的使用,我们拒绝对此进行编码.我希望有一些方法来构建一个只使用常量空间的迭代器.

我的问题是 - 有没有办法在具有以下属性的二叉搜索树上设计迭代器?

  1. 按升序访问元素(即按顺序遍历)
  2. next()hasNext()查询在O(1)时间内运行.
  3. 内存使用量为O(1)

为了更方便,它的罚款,如果你认为迭代(即没有插入,删除或旋转)在树形结构不改变形状,但如果有,确实可以处理这样的解决方案将是真的很酷.

algorithm iterator binary-search-tree

31
推荐指数
2
解决办法
5万
查看次数

改变一个整数

我们有一个整数

int x = 50;
Run Code Online (Sandbox Code Playgroud)

在二进制中,它是

00110010
Run Code Online (Sandbox Code Playgroud)

如何以编程方式更改第四(第4)位?

c c++ bit-manipulation bitwise-operators

31
推荐指数
3
解决办法
4万
查看次数

在C中获取文件扩展名

如何.tiff从C中的文件名中获取文件扩展名(如)?

谢谢!

c string file

30
推荐指数
3
解决办法
4万
查看次数

值初始化自动对象?

我正在编写一个模板类,在我的代码中的某一点上,我希望能够在栈上对参数化类型的对象进行值初始化.现在,我正在通过写一些这样的效果来实现这一目标:

template <typename T> void MyClass<T>::doSomething() {
    T valueInitialized = T();
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

此代码有效,但(除非编译器是智能的)它需要不必要的创建和销毁临时T对象.我想写的是以下内容,我知道这是不正确的:

template <typename T> void MyClass<T>::doSomething() {
    T valueInitialized(); // WRONG: This is a prototype!
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有一种很好的方法来初始化自动对象,而不必显式构造临时对象并将其分配给自动对象.可以这样做吗?或者它是T var = T();如此好?

c++ initialization

30
推荐指数
3
解决办法
1054
查看次数

找到重复超过n/2次的元素

存在具有重复超过N/2个时间的元素的阵列(大小为N),并且阵列中其余元素也可以重复,但是仅重复一个元素超过N/2次.找到号码.

我可以想到几种方法:

  • 天真,保持哈希映射中每个数字的计数.
  • 最简单的是,排序数组和n/2 + 1索引处的数字是所需的数字.
  • 保持仅查找连续重复值的计数.单独检查交替存储值的模式.

无法想到更好的解决方案,必须有.

arrays algorithm

30
推荐指数
6
解决办法
3万
查看次数

size_t是字大小吗?

size_t编译代码的机器的字大小?

用g ++解析,我的编译器视图size_tlong unsigned int.在编译器被调用之前,编译器是否在内部选择某个预处理器宏的大小size_t,或者size_t实际上是stddef.h在字大小内设置的?

还是我偏离轨道?

c c++ size-t

30
推荐指数
2
解决办法
3365
查看次数

你怎么知道在AVL树中进行旋转的位置?

所以我自学了AVL树,我理解它背后的基本思想,但我只是想确保我实际实现它的直觉是有效的:

我会用左旋转检查它 -

所以,以下情况很简单:

      8
     / \
    7   10
   /
  6
 /
3
Run Code Online (Sandbox Code Playgroud)

当我们添加3时,树重新平衡为:

    8
   / \
  6   10
 / \
3   7
Run Code Online (Sandbox Code Playgroud)

但轮换是基于3的增加还是根据7的子树的不平衡?它甚至是基于植根于8的树的不平衡吗?

在我看来,以下示例是事情变得有点毛茸茸的地方:

      9
     / \
    7   10
   / \
  6   8
 /
3
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,当添加3时,7处的子树很好,因此子树不需要旋转.然而,9处的树是不平衡的,加上3,所以我们将旋转基于9.我们得到:

      7
     / \
    6   9
   /   / \
  3   8   10
Run Code Online (Sandbox Code Playgroud)

因此,在编写我的代码时,我很快就会编写以下代码,从小子树开始,使用更大的子树来完成这个工作?

伪代码:

function balanceTree(Node n){

  if (n is not null){

    balanceTree(n.rightchild);
    balanceTree(n.leftchild);
  }

  if (abs(balanceFactor(n))>1){

    rotateAsNeeded(n);// rotate based on balance factor

  }

}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

algorithm rotation avl-tree binary-search-tree data-structures

30
推荐指数
1
解决办法
2万
查看次数

用于实现堆栈的链接列表与动态数组

我开始在学校最后一年开始之前检查数据结构和算法,以确保我掌握一切.一个评论问题说"使用链表或动态数组实现堆栈并解释为什么你做出了最好的选择".

对我来说,使用带有尾指针的列表来实现堆栈似乎更直观,因为它可能需要经常调整大小.对于大量数据来说,列表是更好的选择,因为动态数组重新调整大小是一项昂贵的操作.此外,使用列表,您不需要分配比实际需要更多的空间,因此它更节省空间.

但是,动态数组肯定允许更快地添加数据(除非需要调整大小).但是,我不确定使用数组是否整体更快,或者只是不需要调整大小.

该书的解决方案说"存储非常大的对象,列表是一个更好的实现",但我不明白为什么.

哪种方式最好?应该使用哪些因素来确定哪种实施方式"最佳"?还有,我的逻辑是什么?

performance stack linked-list dynamic-arrays data-structures

29
推荐指数
2
解决办法
2万
查看次数

在图片中找到美国国旗?

为了纪念7月4日,我有兴趣找到一种以编程方式检测图片中的美国国旗.关于在图像找到可口可乐罐头的问题有一个较早且流行的问题,虽然我不确定它们是否适用于旗帜,

  1. 旗帜在风中飘扬,因此可能会遮挡自己或以非线性方式变形(这使得像SIFT这样的技术有点难以使用),以及
  2. 不像可口可乐可以,美国国旗的星条旗不是唯一的美国国旗,并可能是,比如说一部分,利比里亚国旗,排除了很多"行签名"技术.

是否有任何标准的图像处理或识别技术特别适合这项任务?

algorithm image-processing computer-vision

29
推荐指数
1
解决办法
1518
查看次数

如何在最多进行3N比较时实现std :: make_heap?

我查看了C++ 0x标准,发现要求make_heap不应超过3*N比较.

即堆积无序集合可以在O(N)中完成

   /*  @brief  Construct a heap over a range using comparison functor.
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

来源没有给我任何线索(g ++ 4.4.3)

while(true)+ __parent == 0不是线索,而是对O(N)行为的猜测

template<typename _RandomAccessIterator, typename _Compare>
void
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
          _Compare __comp)
{

  const _DistanceType __len = __last - __first;
  _DistanceType __parent = (__len - 2) / 2;
  while (true)
    {
      _ValueType __value = _GLIBCXX_MOVE(*(__first + __parent));
      std::__adjust_heap(__first, __parent, __len, _GLIBCXX_MOVE(__value),
                 __comp);
      if (__parent == 0)
        return;
      __parent--;
    }
}
Run Code Online (Sandbox Code Playgroud)

__adjust_heap看起来像一个log N方法:

while ( __secondChild < (__len - 1) …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm big-o stl binary-heap

28
推荐指数
2
解决办法
7914
查看次数