Redian新闻
>
请大牛指点有哪些AMEX活动
avatar
请大牛指点有哪些AMEX活动# Money - 海外理财
k*j
1
最近碰到一道题,一个large file,一行是一个单词,
too
who
but
beer
给定一个单词,如何得出alphabetical排序里的下个单词。比如beer的下一个是but。
假使file可以fit into memory.
大家有什么好方法?有人提示用bst 或者hash?
avatar
c*e
2
刚有AMEX不长,请大牛指点有哪些AMEX活动,什么时候/怎么参与?谢谢。
avatar
f*t
3
file可以fit into memory
那好办了啊
怎么存都可以
一般这种类似于字典的东西都用prefix tree存
avatar
g*n
4
考古+泡版
avatar
k*j
5
能不能展开说说,prefix tree怎么做。谢谢

【在 f*******t 的大作中提到】
: file可以fit into memory
: 那好办了啊
: 怎么存都可以
: 一般这种类似于字典的东西都用prefix tree存

avatar
g*n
6
有活动时版上一般都有帖子
avatar
f*t
7
这个是很基本的数据结构,建议看一下wiki
我前几天实现了它,只有基本的insert和search,没有对查找child list进行优化,代
码贴出来供参考:
#include
#define MAX_LENGTH 64
using namespace std;
static char buff[MAX_LENGTH];
class Trie {
public:
Trie();
Trie(char value);
bool Insert(const char *str);
bool Search(const char *str) const;
void PrintAll(int pos) const;
private:
char _value;
Trie *_sibling;
Trie *_child;
};
Trie::Trie()
{
_value = 0;
_sibling = NULL;
_child = NULL;
}
Trie::Trie(char value)
{
_value = value;
_sibling = NULL;
_child = NULL;
}
bool Trie::Insert(const char *str)
{
char value = str[0];
if(str == NULL)
{
// cannot insert NULL string
return false;
}
else if(_child == NULL)
{
// append a new child
_child = new Trie(value);
if(value != 0)
return _child->Insert(str + 1);
return true;
}
else
{
Trie *cur = _child;
Trie *past = NULL;
while(cur != NULL)
{
if(cur->_value == value)
{
// try to insert to the next level
if(value == 0)
{
// already exists
return false;
}
// go to next level
return cur->Insert(str + 1);
}
else if(cur->_value > value)
{
// insert before current sibling
if(past == NULL)
{
// there is only one child
_child = new Trie(value);
_child->_sibling = cur;
if(value != 0)
return _child->Insert(str + 1);
else
return true;
}
else
{
// insert the new node among siblings
Trie *newnode = new Trie(value);
past->_sibling = newnode;
newnode->_sibling = cur;
if(value != 0)
return newnode->Insert(str + 1);
else
return true;
}
}
past = cur;
cur = cur->_sibling;
}
// append a new node behind the last sibling
Trie *newnode = new Trie(value);
past->_sibling = newnode;
if(value != 0)
return newnode->Insert(str + 1);
else
return true;
}
}
void Trie::PrintAll(int pos) const
{
Trie *cur = _child;
while(cur != NULL)
{
buff[pos] = cur->_value;
if(cur->_value != 0)
cur->PrintAll(pos + 1);
else
printf("%s\n", buff);
cur = cur->_sibling;
}
}
bool Trie::Search(const char *str) const
{
if(_child == NULL)
return false;
else
{
Trie *cur = _child;
char value = str[0];
while(cur != NULL)
{
if(cur->_value == value)
{
if(value != 0)
return cur->Search(str + 1);
else
return true;
}
else if(cur->_value > value)
return false;
else
cur = cur->_sibling;
}
return false;
}
}
int main(int argc, char *argv[])
{
Trie *root = new Trie();
root->Insert("abc");
root->Insert("abd");
root->Insert("bcd");
root->Insert("efg");
root->Insert("bak");
root->Insert("ab");
memset(buff, 0, MAX_LENGTH);
root->PrintAll(0);
for(int i = 1; i < argc; i++)
{
if(root->Search(argv[i]))
printf("Found string %s\n", argv[i]);
else
printf("Did not find string %s\n", argv[i]);
}
return 0;
}
avatar
k*j
8
谢谢。先学习一下

【在 f*******t 的大作中提到】
: 这个是很基本的数据结构,建议看一下wiki
: 我前几天实现了它,只有基本的insert和search,没有对查找child list进行优化,代
: 码贴出来供参考:
: #include
: #define MAX_LENGTH 64
: using namespace std;
: static char buff[MAX_LENGTH];
: class Trie {
: public:
: Trie();

avatar
i*e
9
或者可以用一个数组储存 26 个子节点,每个节点代表一个字母。
这个比链表实现简单多了。贴代码供参考。
struct Trie {
Trie() {
memset(children, 0, 26*sizeof(Trie*));
end = false;
}
void insert(const char *s) {
Trie *trie = this;
while (*s) {
int idx = *s-'a';
if (!trie->children[idx])
trie->children[idx] = new Trie();
trie = trie->children[idx];
s++;
}
trie->end = true;
}
Trie *children[26];
bool end;
};
avatar
i*e
10
利用链表来实现 trie insert 的非递归代码如下,要复杂写。对 double pointer 的
理解请参考这个帖:
http://www.mitbbs.com/article_t0/JobHunting/31881903.html
struct Trie {
Trie() : c(0), son(NULL), next(NULL), end(false) {
}
Trie(char key) : c(key), son(NULL), next(NULL), end(false) {
}
void insert(const char *s) {
Trie *trie = this;
while (*s) {
Trie **p = NULL;
if (!trie->find(*s, p)) {
Trie *temp = *p;
*p = new Trie(*s);
(*p)->next = temp;
}
trie = *p;
assert(trie);
s++;
}
trie->end = true;
}
bool find(char key, Trie ** &ret) {
Trie **p = &(this->son);
while (*p) {
if (key < (*p)->c) {
ret = p;
return false;
} else if (key == (*p)->c) {
ret = p;
return true;
}
p = &((*p)->next);
}
ret = p;
return false;
}
char c;
Trie *next;
Trie *son;
bool end;
};
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。