stl里面有没有适合经常要进行查找的链表的容器?

kingstarer 2009-04-27 12:10:41
现在在写一个程序实现大概如下的内容

A状态的子状态有B和C两个
B状态的子状态有D和E,C状态的子状态有F,G,H
D到H又有各自的子状态,子状态又有子状态

程序读入A状态,并依次生成B、C、D、E、...H

接下来
程序循环读入一个状态值,并返回A到该状态的路径
比如输入状态D,就要返回A->B->D

我想了一个如下的数据结构
 
struct tab_STADE
{
VALUE value;
struct STADE *father;
inline bool operator < (const sql_node& other)
{
}
}STATE


以A为根结点,建立二叉平衡树,接着从A出发生成子节点并插到平衡树中

但是这样做比较麻烦,不知道C++标准库里面有没有现成的容器能处理这种情况呢?
(
想过一个方案:map<STATE, STATE *>, 状态值做key,父节点的指针做value
但是这样做同一个状态需要在内存里面有两份拷贝,太浪费了
本来想想办法使key指向value,这样省了内存,但是刚才发贴问了一下,这样实现似乎不行
http://topic.csdn.net/u/20090426/21/44d59d90-281c-400f-bc26-862a2bff4e6d.html?seed=2128373325
)
...全文
250 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingstarer 2009-04-28
  • 打赏
  • 举报
回复
谢谢LS的建议,不过我的状态里面的buffer并不是用来存放路径的,是存放状态的值,是另有特殊用途的

今天突然想到一个方法,可以用如下的方法

class STATE
{
char buffer[8];
inline bool operator < (const sql_node& other)
{
if (memcmp(array, other.array, AEEAY_SIZE) < 0)
{
return true;
}
else
{
return false;
}
}
}

class op_STATE
{
public:
STATE *m_pstate;

inline bool operator < (const op_STATE& other)
{
return !(*m_pstate < *other.m_pstate);
}

};

map<op_STATE, op_STATE> P_STATE_MAP;

map存放节点指针,不存放节点值
key是状态指针,value是父状态指针




还没完全写完,不过估计可以
kingstarer 2009-04-27
  • 打赏
  • 举报
回复
嗯 是要搜索路径 不过不是图 只是一棵树

输入叶子结点的值,要求输出从根到叶子的过程

========================
事实上我是在做一道题目需要用到最佳搜索优先算法,想在C++里面找一个可以用来实现的close表的容器
kingstarer 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mengde007 的回复:]
map <STATE, STATE *> 只有一份啊,楼主;因为第二个参数是指针类型的;他们指向了同一块内存;
[/Quote]
map的key里面存了一份,STATE *又不能指向这个key值,因为它可能会变化,所以肯定还要有另一份内存


[Quote=引用 8 楼 harry330 的回复:]
vector list map都可以。
[/Quote]
事实我需要的只是增加和查找两个功能
查找效率要求高一点,用vector查找所我所知的方法里面都是O(n)级的
  • 打赏
  • 举报
回复
程序循环读入一个状态值,并返回A到该状态的路径
比如输入状态D,就要返回A->B->D

。。不好意思,没看仔细需求。

其实你这里就是一个有向图,然后搜索路径的问题。

  • 打赏
  • 举报
回复
A状态的子状态有B和C两个
B状态的子状态有D和E,C状态的子状态有F,G,H
D到H又有各自的子状态,子状态又有子状态

程序读入A状态,并依次生成B、C、D、E、...H

接下来
程序循环读入一个状态值,并返回A到该状态的路径
比如输入状态D,就要返回A->B->D



map <char,set <char> >

查找map肯定是快,是红黑树。A,B,C这些状态作为键值,然后他们的子状态存入set。感觉基本可以了。
  • 打赏
  • 举报
回复
map<char,set<char> >

这样可以满足你的需求不?
IONPhantom 2009-04-27
  • 打赏
  • 举报
回复
vector和list都没有可查找关键字阿,只有map有
harry330 2009-04-27
  • 打赏
  • 举报
回复
vector list map都可以。
如果删除操作不多,而且数据量不是很大的时候,用vector,若要经常进行删除操作,且要在任何位置插入值,则list,当数据量很大,效率要求高的时候用map,如果数据量极大,map都不能满足的话,就用hash_map,不过hash_map不在标准库里面,看你所用的编译器版本的stl实现有没有hash_map,一般来说map的效率可以满足多数需求。
mengde007 2009-04-27
  • 打赏
  • 举报
回复
map <STATE, STATE *> 只有一份啊,楼主;因为第二个参数是指针类型的;他们指向了同一块内存;
kingstarer 2009-04-27
  • 打赏
  • 举报
回复
vector查找起来效率似乎是O(n) ?

好像不是很适合
hiboys 2009-04-27
  • 打赏
  • 举报
回复
查询快的容器用vector喽,
你的struct最好实现==,然后用find_first_of查找。
速度取决于你的==实现的好不好
hjjdebug 2009-04-27
  • 打赏
  • 举报
回复
有一个想法,既然是状态用字符表示,可不可以把你的路径(从根到该节点的路径)
用状态字符表示。 这样,你只要输入状态,自然也就代表着知道了路径。
也就是说, 根节点为A, 他有两个子节点为AB, AC, AB又有三个子节点ABB, ABF,ABG
...
这样当你输入结点acfth, 就知道距离根为4
kingstarer 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hejinjing_tom_com 的回复:]
另外问一下,你的状态值是用什么表示的? 是一个数值, 还是一个字符串?
这可能设计算法时要考虑吧。
[/Quote]

typedef struct tab_STADE
{
char buffer[8];
}STADE;

一个字符数组
hjjdebug 2009-04-27
  • 打赏
  • 举报
回复
另外问一下,你的状态值是用什么表示的? 是一个数值, 还是一个字符串?
这可能设计算法时要考虑吧。
kingstarer 2009-04-27
  • 打赏
  • 举报
回复
比较时只是简单地调用memcmp
kingstarer 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 taodm 的回复:]
楼主啊,你需要处理多大的数据量?
[/Quote]
closetab表里面的子状态数最大不超过16!

STADE的定义如下

typedef struct tab_STADE
{
char buffer[8];
}STADE;

hjjdebug 2009-04-27
  • 打赏
  • 举报
回复
看起来这是一个多叉树,重点是多叉树的搜索算法。
自己写吧,stl的排序,搜索算法效率都是很低的。因为它们牵连大量的函数调用。
Cpp权哥 2009-04-27
  • 打赏
  • 举报
回复
可以考虑用位运算来处理。根状态A不用表示,各级子状态根据数量多少分配不同的位数。如果每一级子状态最多只有4种子状态,那么每一级分配2位就行了。这样一个32位的int或者long就足以表示32级子状态,加上根状态一共33级。然后你可以用map<char,int>来快速查找状态,根据对应的int值来取得路径。
taodm 2009-04-27
  • 打赏
  • 举报
回复
楼主啊,你需要处理多大的数据量?
hityct1 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hityct1 的回复:]
在这步:程序读入A状态,并依次生成B、C、D、E、...H
做一下预处理可否:
对于A状态的子状态有B和C两个,可转化为
B->A
C->A
这样(既然是是树)
set <pair <char,char> >就可以了。
[/Quote]
sorry,是map<char,char>
加载更多回复(1)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧