小编Rem*_*o.D的帖子

C中的N-ary树

哪个是用C语言实现N-ary树的巧妙实现?

特别是,我想实现一个n-ary树,而不是自我平衡,每个节点中有一个未绑定数量的子节点,其中每个节点都包含一个已定义的结构,例如:

struct task {
  char command[MAX_LENGTH];
  int required_time;
};
Run Code Online (Sandbox Code Playgroud)

c struct abstract-data-type n-ary-tree

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

sed:根据第二个连接线

我有一个偶尔会有分割线的文件.线条以"+"开头(可能以空格开头)这一事实表明了分裂.

line 1
line 2
  + continue 2
line 3
...
Run Code Online (Sandbox Code Playgroud)

我想加入拆分线:

line 1
line 2 continue 2
line 3
...
Run Code Online (Sandbox Code Playgroud)

使用sed.我不清楚如何加入一行.

有什么建议吗?

sed

17
推荐指数
1
解决办法
7751
查看次数

在线计算机科学文章库?

当我需要一些复杂的算法时,我首先检查互联网上是否已发布任何相关内容.十分之十,我会发现有人已经找到了比我想象的更聪明的解决方案.

除了通用的Google搜索,我使用:

  • Citeseer 有很多来自大学的理论报告
  • Dobb博士的门户比Citeseer更实用,但往往对特定技术或语言过于具体
  • Arxiv更理论包含草稿和预印本(以防万一我绝望:))

我还发现了J.UCS(通用计算机科学杂志)包含一些有趣的文章(但我没有真正使用过我在那里发现的任何信息).

你知道其他任何可以免费搜索和阅读好CS文章的地方吗?

computer-science

16
推荐指数
1
解决办法
1706
查看次数

C中的杜鹃哈希

有人在C中实现了Cuckoo散列吗?如果有一个开源,非GPL版本,它将是完美的!

亚当在他的评论中提到它,任何人都知道它为什么用得不多?这只是一个实施问题还是在实践中没有实现好的理论属性?

c hashtable

16
推荐指数
3
解决办法
1万
查看次数

向联盟施放常数

以下代码:

#include <stdio.h>

typedef union {
   int   n;
   char *s;
} val_t;

int main(void) {
  val_t v1,v2;

  v1 = (val_t)"Hello World";
  v2 = (val_t)10;

  printf("%s %d\n", v1.s, v2.n);
  return(1);
}
Run Code Online (Sandbox Code Playgroud)

使用gcc正确编译和执行.如果试图转换一个常量,而且联合中没有合适的字段,则会产生错误消息.

但是,查看(C99)标准,我无法找到描述此行为的部分.因此,我的问题:

如果联合类型的字段具有兼容类型,那么C标准是否保证我可以将常量强制转换为联合类型?

或者,换句话说:

((val_t)10)一个有效的rvalue类型val_t

了解其他编译器(或至少MS Visual C++)是否支持此行为也很有趣.有人知道吗?

编辑:转换为联盟是一个GCC扩展,所以使用它不是一个好主意.

感谢Maurits和Neil!我没想过用-pedantic检查!

c types casting

15
推荐指数
2
解决办法
2060
查看次数

令人难忘的32位值作为常量

我正在寻找一个令人难忘的32位值作为常量.如果可能的话,它也应该有点滑稽.

到目前为止,我已经提出了这两个:

0xcafebabe

0xdeaddad
Run Code Online (Sandbox Code Playgroud)

你也可以推荐一些其他的吗?

谢谢.

c c++ constants

6
推荐指数
2
解决办法
897
查看次数

是否有通过选择通缉区域创建正则表达式文本的应用程序?

我希望这是程序员相关的问题.我从事C#编程的业余爱好.为了我自己的目的,我需要解析html文件,最好的想法是..正则表达式.正如许多人发现的那样,学习它们非常耗时,因此我很感兴趣,如果你知道一些能够接受输入的应用程序(任何代码片段),理解我需要的东西(由我选择一块我需要"剪掉"的代码,并为它或更多选项提供正确的正则表达式.

正如我所听到的,Regex本身就是一门科学,所以它可能并不像我想象的那么容易.

c# regex automation

5
推荐指数
1
解决办法
2479
查看次数

C风格:宏还是预处理器?

我已经编写了一个库来匹配一组模式的字符串,现在我可以轻松地将词汇扫描程序嵌入到C程序中.

我知道有许多成熟的工具可用于创建词法扫描程序(lex和re2c,仅列出前两个想到的)这个问题不是关于词法分析器,而是关于"扩展"C语法的最佳方法.词法分析器示例只是一个普遍问题的具体案例.

我可以看到两种可能的解决方案

  1. 编写一个预处理器,将带有嵌入词法分析器的源文件转换为普通的C文件,并可能转换为要在编译中使用的一组其他文件.
  2. 编写一组C宏来以更易读的形式表示词法分析器.

我已经做过两个但问题是:"你会根据以下标准考虑哪一个更好的做法?"

  • 可读性.词法分析器逻辑应清晰易懂
  • 可维护性.找到并修复bug不应该是一场噩梦!
  • 构建过程中的干扰.预处理器在构建过程中需要额外的步骤,预处理器必须在路径等中等.

换句话说,如果你不得不维护或编写一个使用这两种方法之一的软件,那么一个人会不会让你失望?

例如,以下是针对以下问题的词法分析器:

  • 求和所有数字(可以是十进制形式,包括像1.3E-4.2那样的指数)
  • 跳过字符串(双引号和单引号)
  • 跳过列表(类似于LISP列表:(3 4(0 1)()3))
  • 在遇到单词end(case无关紧要)或缓冲区末尾时停止

在两种风格.

/**** SCANNER STYLE 1 (preprocessor) ****/
#include "pmx.h"

t = buffer

while (*t) {
  switch pmx(t) { /* the preprocessor will handle this */
    case "&q" :         /* skip strings */
      break; 

    case "&f<?=eE>&F" : /* sum numbers */ 
      sum += atof(pmx(Start,0));
      break;

    case "&b()":        /* skip lists */
      break;

    case "&iend" :      /* stop processing */ …
Run Code Online (Sandbox Code Playgroud)

c macros preprocessor c-preprocessor

4
推荐指数
1
解决办法
1614
查看次数

C++:从MIDI消息中获取数据(DWORD)

我用C++编写了一个简单的MIDI控制台应用程序.这是整个事情:

#include <windows.h>
#include <iostream>
#include <math.h>
using namespace std;
void CALLBACK midiInputCallback(HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
 switch (wMsg) {
  case MIM_MOREDATA:
  case MIM_DATA:
   cout << dwParam1 << " ";
   PlaySound("jingle.wav", NULL, SND_ASYNC | SND_FILENAME);
   break;
 }
}
int main() {
 unsigned int numDevs = midiInGetNumDevs();
 cout << numDevs << " MIDI devices connected:" << endl;
 MIDIINCAPS inputCapabilities;
 for (unsigned int i = 0; i < numDevs; i++) {
  midiInGetDevCaps(i, &inputCapabilities, sizeof(inputCapabilities));
  cout << …
Run Code Online (Sandbox Code Playgroud)

c++ midi

4
推荐指数
1
解决办法
2009
查看次数

随机二叉搜索树

像treap这样的随机二进制搜索树以高概率提供了良好的性能(按O(log n)的顺序),同时避免了像AVL,red-blackm,AA等确定性平衡树所需的复杂(和昂贵)重新平衡操作. .

我们知道,如果我们将随机密钥添加到简单的BST中,我们可以预期它是合理平衡的.一个简单的原因是n个节点的非均衡树的数量远远低于"几乎平衡的"树的数量,因此,插入密钥的随机顺序很可能以可接受的树结束.

在这种情况下,在"计算机程序设计的艺术"中,Knuth给出了一点点多于1.3*lg2(n)作为相当好的路径的平均长度.他还说,从随机树中删除一个随机密钥可以保持其随机性(因此它具有良好的平均平衡).

那么,似乎二进制搜索树以随机顺序插入和删除密钥,很可能为所有三个操作提供O(log n)顺序的性能:搜索,插入和删除.

也就是说,我想知道以下方法是否会提供相同的良好属性:

  • 采用已知为"好"的散列函数h(x)(例如,它确保密钥的均匀扩展)
  • 使用键上h(x)设置的顺序而不是k上的顺序.
  • 如果发生碰撞,请按钥匙订购.如果散列键足够好并且散列函数的范围远大于键的集合,那么这应该是罕见的.

举例来说,按顺序插入的密钥{4,3,5,1,2}的BST将是:

                  4
                 / \
                3   5
               /\
              1  2
Run Code Online (Sandbox Code Playgroud)

假设哈希函数将它们映射到(分别){221,142,12,380,18),我们就会得到.

                    221(4)
                   /   \
              142(3)  380(1)
             /    \
           12(5) 18(2)
Run Code Online (Sandbox Code Playgroud)

关键点是"常规"BST可能会退化,因为键是按照用于将它们存储在树中的相同排序关系插入的(它们的"自然"排序,例如字符串的字母顺序)但是哈希函数在键上引入与"自然"完全无关的排序,因此,应该给出与按随机顺序插入键相同的结果.

一个强有力的假设是哈希函数是"好的",但我认为它不是一个不合理的.

我没有在文献中找到任何类似方法的参考,所以它可能是完全错误的,但我不明白为什么!

你觉得我的推理有什么缺点吗?有人已经尝试过吗?

hash binary-tree data-structures

4
推荐指数
1
解决办法
1196
查看次数