@ysner
2018-08-15T16:52:32.000000Z
字数 1302
阅读 2072
map
哈希
这两种技巧常用于记录和去重量少而分散的状态。
都体现了映射思想。
我一般是数组开不下时拿这玩意判重。
据说特别慢???
(注意一下比较规则必须顾及到所有变量,否则会重复)
struct node
{
int x,y;
bool operator < (node const &o) const {return (x<o.x)||(x==o.x&&y<o.y);}
}
map<node,int>Map;
if(map[(node){x,y}]) ;
于是因太弱而被教育了一番
还有一种排序功能(类比树)。如果用存字符串,那么用以下方式就能按字典序遍历所有字符串。
map<node,int>::iterator iter;
for(iter=Map.begin();iter!=Map.end();iter++)
{
string A=iter->first;
int B=iter->second;
...
}
还有一种叫的玩意儿,存储时不排序,省时间。
定义方式:(注意需要一个函数)
#include<tr1/unordered_map>
struct nnode
{
int x,y;
bool operator == (const nnode &o) const {return x==o.x&&y==o.y;}
}p[N*10];
struct Hash
{
std::size_t operator () (const nnode &o) const{return o.x*N*10+o.y;};
};
std::tr1::unordered_map<nnode,int,Hash>mp;
虽然能有效区分、避免重复,但其自带的)复杂度饱受诟病。
我们可以弃置一定正确性,来换取时间复杂度降为,这就是本质。
如何保证更高的正确性?这个问题没有答案,因而很多方程都有其合理性。
一般在开始时,我们要选取一个,原则是使值分散,减少冲突。
通常将字符串看成一个进制数,比如看成,
那么哈希值就是
这玩意专为树的同构而生。
怎样的两颗树能称为同构树?
即树的深度相同、孩子、子树大小相同,只有孩子顺序不同。
当然,还有另一种方法,就是如果时间复杂度允许,则可以以每个点为根,累计统计每颗子树大小乘不同素数的和。这些在根上的和排序后如果完全相同,也可证同构。
用来处理状态量大而分散的情况,没有保险。。。
方程自定。