我正在使用C语言编写哈希表,我正在测试字符串的哈希函数.
我尝试过的第一个函数是添加ascii代码并使用modulo(%100)但是我在第一次数据测试时得到的结果很差:140个单词的40个冲突.
最终的输入数据将包含8 000个单词(它是一个文件中的dictionnary存储).哈希表声明为int table [10000]并包含txt文件中单词的位置.
第一个问题是哪个是散列字符串的最佳算法?以及如何确定哈希表的大小?
提前致谢 !
:-)
通常我需要根据非POD常量元素的值选择要做的事情,如下所示:
switch( str ) {
case "foo": ...
case "bar": ...
default: ...
}
Run Code Online (Sandbox Code Playgroud)
可悲的是switch
只能用整数:error: switch quantity not an integer
.
实现这样的事情最简单的方法是获得一系列if
s:
if( str == "foo" ) ...
else if( str == "bar" ) ...
else ...
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案看起来很脏并且应该花费O(n),其中n是案例数,而在最坏的情况下,使用二进制搜索,这段代码可能花费O(log n).
使用一些数据结构(如Maps)可以获得表示字符串的整数(O(log n)),然后使用O(1)switch
,或者可以通过if
在右边嵌套s 来实现静态二进制排序但是,这些黑客攻击还需要大量编码,使一切变得更加复杂和难以维护.
最好的方法是什么?(快速,干净,简单,正如switch
声明所述)
我想在我的程序中使用switch-case但编译器会生成错误.我如何使用该switch
语句QString
?
编译器给我这个错误:
switch expression of type 'QString' is illegal
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
bool isStopWord( QString word )
{
bool flag = false ;
switch( word )
{
case "the":
flag = true ;
break ;
case "at" :
flag = true ;
break ;
case "in" :
flag = true ;
break ;
case "your":
flag = true ;
break ;
case "near":
flag = true ;
break ;
case "all":
flag = true ;
break ;
case …
Run Code Online (Sandbox Code Playgroud) 我在某处读到该switch
语句使用"二进制搜索"或一些排序技术来精确选择正确的情况,与else-if梯形图相比,这增加了它的性能.
如果我们按顺序给出案例,那么交换机的工作速度会更快吗?是这样吗?你能在这个问题上添加宝贵的建议吗?
我们在这里讨论了相同的问题并计划发布作为一个问题.
可能重复:
在C中打开字符串的最佳方法
字符串(c字符数组)和switch语句一起使用的一般方法是什么?我正在查询数据库中存储为的货币
"USD"
"EUR"
"GBP"
Run Code Online (Sandbox Code Playgroud)
等等。来自PHP背景,我只需执行以下操作:
switch ($string) {
case "USD":
return "$";
break;
case "EUR":
return "€";
break;
case "GBP":
return "£";
break;
default:
return "$";
}
Run Code Online (Sandbox Code Playgroud)
在C中,case值必须是整数。我将如何在C中实现类似的功能?我最终会在一个很大的if / else块中写很多strcmp吗?另请注意,我不能简单地比较货币的第一个字符,因为某些字符(尽管在本示例中不是)以相同的字符开头。
int a = 0 , b = 0;
char* c = NULL;
int main(int argc , char ** argv){
c = argv[2];
a = atoi(argv[1]);
b = atoi(argv[3]);
switch(c){
case "+": printf(a+b);
break;
}
printf("\n\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 好的,所以这里.我尝试过在C字符串值做一个开关,如所描述这里.但是,结构数组似乎没有正确初始化.我的(简化)程序如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BADKEY -1
#define VALUE 1
#define OTHERVALUE 2
#define FOOVALUE 3
#define NREQKEYS (sizeof(lookuptable)/sizeof(symstruct_t))
typedef struct {
char *key;
int val;
} symstruct_t;
static symstruct_t lookuptable[] = {
{ "some value here", VALUE },
{ "other value", OTHERVALUE },
{ "yet another one", FOOVALUE }
};
int main(void) {
// Testing...
int i;
for (i = 0; i < NREQKEYS; i++) {
symstruct_t *sym = lookuptable + i * sizeof(symstruct_t); …
Run Code Online (Sandbox Code Playgroud) 如何输入String并在Switch命令中使用它?这是代码,但我得到的开关数量不是整数错误.
#include <stdio.h>
int main(void) {
float usd2 = 0.9117;
float yen2 = 0.0073;
float pound2 = 1.4137;
float eingabe;
char whr[] = "";
printf("Bitte Summe in EURO eingeben: ");
scanf("%f", &eingabe);
printf("Die Währungnummer eingeben USD, YEN, POUND: ");
scanf("%s", &whr);
switch(whr) {
case "usd": printf("%.4f EURO es sind dann %.4f USD.", eingabe, (eingabe/usd2));
break;
case "yen": printf("%.4f EURO es sind dann %.4f YEN.", eingabe, (eingabe/yen2));
break;
case "pound": printf("%.4f EURO es sind dann %.4f POUND.", eingabe, (eingabe/pound2));
break;
default: …
Run Code Online (Sandbox Code Playgroud) 不知何故,我的switch语句没有通过我的任何案例,但它不应该进入一个?(我使用/sf/answers/281048701/作为参考).
没有输出,应用程序被阻止后.
#include <stdio.h>
#include <stdlib.h>
#define BADKEY -1
#define string1 1
#define string2 2
#define string3 3
#define string4 4
char *x = "string1";
typedef struct {char *key; int val; } t_symstruct;
static t_symstruct lookuptable[] = {
{ "string1", string1 }, { "string2", string2 }, { "string3", string3 }, { "string4", string4 }
};
#define NKEYS (sizeof(lookuptable)/sizeof(t_symstruct))
int keyfromstring(char *key) {
int i;
for (i=0; i < NKEYS; i++) {
t_symstruct *sym = lookuptable + i;
printf("before: …
Run Code Online (Sandbox Code Playgroud)