`
javayestome
  • 浏览: 1031138 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

马尔可夫。。。。

F# 
阅读更多
不得不说,the practice of programming 一书真的很不错。。。。。根据一些文字的模式,随即生产文字。。。具体做啥找书看。。。。


#include<stdlib.h>
#include<stdio.h>
#include<string.h>

enum{
NPREF = 2, //number of prefix words
NHASH = 4093, //size of state hash table array
MAXGEN = 10000, //maximum words generated
MULTIPLIER=31
};

typedef struct State State;
typedef struct Suffix Suffix;
struct State{ //prefix+suffix list
char *pref[NPREF]; //prefix words
Suffix *suf; // suffix list
State *next; // next in hash table
};
struct Suffix{ //list of suffixes
char *word; //suffix
Suffix *next; //next in list of suffix
};

State *statetab[NHASH]; //hash table of states
char NONWORD[]="\n";


//compute hash value for array of NPREF strings
unsigned int hash(char *s[NPREF])
{
unsigned int h;
unsigned char *p;
int i;
h=0;
for(i=0;i<NPREF; i++)
for(p = (unsigned char *)s[i];*p!='\0';p++)
h=MULTIPLIER*h + *p;
return h % NHASH;
}

//lookup:search for prefix,create if requested
//return pointer if present or created;NULL if not
//creation doesn't strdup so strings mustn't change later
State* lookup(char *prefix[NPREF],int create)
{
int i,h;
State *sp;
h=hash(prefix);
for(sp=statetab[h];sp != NULL;sp=sp->next)
{
for(i=0;i<NPREF;i++)
if(strcmp(prefix[i],sp->pref[i])!=0)
break;
if(i == NPREF) //found it
return sp;
}
if(create)
{
sp=(State *)malloc(sizeof(State));
for(i=0;i<NPREF;i++)
sp->pref[i]=prefix[i];
sp->suf=NULL;
sp->next=statetab[h];
statetab[h]=sp;
}
return sp;
}

//addsuffix:add to state ,suffix must not change later
void addsuffix(State *sp,char *suffix)
{
Suffix *suf;
suf=(Suffix *)malloc(sizeof(Suffix));
suf->word=suffix;
suf->next=sp->suf;
sp->suf=suf;
}

//add:add word to suffix list,update prefix
void add(char *prefix[NPREF],char *suffix)
{
State *sp;
sp = lookup(prefix,1); //create if not found
addsuffix(sp,suffix);
//move the words down the prefix
memmove(prefix,prefix+1,(NPREF-1)*sizeof(prefix[0]));
prefix[NPREF-1]=suffix;
}

//build :read input ,build prefix table
void build(char *prefix[NPREF],FILE *f)
{
char buf[100],fmt[10];//="%99s";
sprintf(fmt,"%%%ds",sizeof(buf)-1);
while(fscanf(f,fmt,buf)!=EOF)
add(prefix,strdup(buf));
}

//gennerate:produce output,one word per line
void generate(int nwords)
{
State *sp;
Suffix *suf;
char *prefix[NPREF],*w;
int i,nmatch;

for(i=0;i<NPREF;i++)//reset initial prefix
prefix[i]=NONWORD;

for(i=0;i<nwords;i++)
{
sp=lookup(prefix,1);
nmatch=0;
for(suf = sp->suf;suf!=NULL;suf=suf->next)
if(rand()% ++ nmatch==0)//prob = 1/nmatch
w = suf->word;
if(strcmp(w,NONWORD)==0)
break;
printf("%s\n",w);
memmove(prefix,prefix+1,(NPREF-1)*sizeof(prefix[0]));
prefix[NPREF-1]=w;
}
}

//markov main
int main(void)
{
int i, nwords=MAXGEN;
char *prefix[NPREF];
for(i=0;i<NPREF;i++)
prefix[i]=NONWORD;
build(prefix,stdin);
add(prefix,NONWORD);
printf("\n");
generate(nwords);
return 0;
}



c++版本。。。。。代码要少些。。可是速度就。。。


#include<iostream>
#include<string>
#include<deque>
#include<map>
#include<vector>

using namespace std;


typedef deque<string> Prefix;
map<Prefix,vector<string> > statetab; //prefix--suffixs
const string NONWORD="\n";

enum{
NPREF = 2, //number of prefix words
NHASH = 4093, //size of state hash table array
MAXGEN = 10000 //maximum words generated
};

void add(Prefix& prefix,const string& s)
{
if(prefix.size() == NPREF)
{
statetab[prefix].push_back(s);
prefix.pop_front();
}
prefix.push_back(s);
}

void build(Prefix& prefix,istream& in)
{
string buf;
while(in>>buf)
add(prefix,buf);
}



void generate(int nwords)
{
Prefix prefix;
int i;
for(i=0;i<NPREF;i++)
add(prefix,NONWORD);
for(i=0;i<nwords;i++)
{
vector<string>& suf=statetab[prefix];
const string& w=suf[rand()%suf.size()];
if(w==NONWORD)
break;
cout<<w<<"\n";
prefix.pop_front();
prefix.push_back(w);
}
}


int main()
{
int nwords=MAXGEN;
Prefix prefix;
for(int i=0;i<NPREF;i++)
add(prefix,NONWORD);
build(prefix,cin);
add(prefix,NONWORD);
generate(nwords);
}
分享到:
评论

相关推荐

    一阶平稳马尔可夫信源状态概率及极限熵

    马尔可夫信源是一种非平稳信源,而“一阶平稳马尔可夫信源状态概率及极限熵”主要讨论“一阶”“时齐”“遍历”条件下的平稳马尔可夫信源及极限熵,在以下的讨论中我们首先会讲到 “一阶”“时齐”“遍历”...

    MSRegress_markovmatlab_马尔可夫_马尔可夫区制_combinec8x_源码

    马尔可夫区制(Markov Chain)是一种数学模型,用于描述一个系统随时间演变的行为。在马尔可夫模型中,系统所处的状态只依赖于它当前的状态,而与它如何到达该状态无关。这种特性使得马尔可夫模型在许多领域,如...

    二阶马尔可夫链1

    二阶马尔可夫链 二阶马尔可夫链是一种特殊的马尔科夫链,它的当前状态仅取决于前两个状态。这种链的特点是,它的转移概率矩阵可以用来描述状态之间的转移关系。 在本例中,我们定义了一个二阶马尔可夫链,状态空间...

    马尔可夫链的运用

    马尔可夫链是一种数学模型,它被广泛应用于图像处理领域。文章中提到的“马尔可夫链在图像中的应用”,主要涉及对图像进行识别和分析。在此,我们可以详细解释马尔可夫链的基本原理、图像识别中的应用以及文章中提到...

    空间马尔可夫链软件文档

    【空间马尔可夫链软件文档】是一款专用于分析数据转移概率的工具,由工具视界团队在2022年开发。它结合了传统的马尔科夫链和空间马尔可夫链理论,便于研究人员快速生成分析结果,提高工作效率。这款软件在学术界有...

    马尔可夫过程ppt汇总

    马尔可夫过程是一种在数学和统计学中广泛使用的随机过程模型,它具有“无记忆”性质,即当前状态只依赖于前一个或几个状态,而与过去的历史无关。这一特性使得马尔可夫过程在许多领域都有重要的应用,如自然语言处理...

    预测方法 马尔可夫 马尔可夫马尔可夫马尔可夫

    马尔可夫马尔可夫马尔可夫马尔可夫马尔可夫马尔可夫预测 马尔可夫

    隐马尔可夫预测代码(含有大量案例),马尔可夫分析预测法属于什么,matlab

    隐马尔可夫模型(HMM,Hidden Markov Model)是一种统计建模方法,广泛应用于自然语言处理、语音识别、生物信息学等领域。在本文中,我们将深入探讨马尔可夫预测法及其在MATLAB环境中的应用。 马尔可夫模型,尤其是...

    Markov+熵_Mathmatics_马尔可夫信源_

    在信息论中,马尔可夫信源(Markov Source)是一种重要的离散随机过程,它假设当前状态只与前一个状态有关,而与更早的状态无关。这种模型广泛应用于语言建模、文本生成、通信系统和许多其他领域。本文将深入探讨...

    HMM隐马尔可夫模型用于中文分词

    隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计模型,被广泛应用于模式识别、自然语言处理等领域。HMM的核心思想是通过一个可以观察的马尔可夫过程来描述一个隐含的状态序列,其中状态不可直接观察到,但每...

    第六章马尔可夫模型.ppt

    马尔可夫模型是概率建模的一种方法,由俄国数学家马尔可夫提出,广泛应用于自然语言处理、语音识别、机器翻译等多个领域。它的核心思想是基于“马尔可夫假设”,即当前状态只与前一状态或有限个状态有关,而与更远的...

    基于加权马尔可夫链修正的ARIMA 预测模型的研究.pdf

    "基于加权马尔可夫链修正的ARIMA预测模型的研究" 本研究提出了一种基于加权马尔可夫链修正的ARIMA预测模型,以解决设备状态参数预测问题。该模型通过引入加权马尔可夫链对ARIMA模型的残差进行分析,提高了预测精度...

    HMM隐马尔可夫模型MATLAB实现

    隐马尔可夫模型(Hidden Markov Model,简称HMM)是概率统计领域中的一个重要模型,尤其在自然语言处理、语音识别、生物信息学等领域有着广泛的应用。在MATLAB环境中,我们可以利用其强大的数学计算能力和丰富的函数...

    MCMCmatlabtutorial_mcmc_马尔可夫链_蒙特卡洛_马尔可夫_matlab

    **马尔可夫链蒙特卡洛(Markov Chain Monte Carlo, MCMC)方法**是一种在统计学和计算科学中广泛使用的抽样技术,尤其在处理高维度问题时非常有效。它结合了马尔可夫链的性质和蒙特卡洛模拟的思想,能够生成从复杂...

    马尔可夫过程在信源编码

    ### 马尔可夫过程在信源编码的知识点详解 #### 1. 随机过程概述 - **随机过程定义**:随机过程是指一个随时间变化的随机变量序列,其中每一时刻的取值都是随机的。这些随机变量构成了一系列的样本函数,形成了随机...

    马尔可夫链 数模 建模 教材

    马尔可夫链(Markov chain)是一种统计模型,用于描述一个系统随时间演变的行为。在数学和计算机科学中,特别是在概率论、信息处理、自然语言处理等领域,马尔可夫链具有广泛的应用。马尔可夫链的核心特性是“无后效...

    《马尔可夫决策过程》电子书

    马尔可夫是彼得堡数学学派的代表人物,以数论和概率论方面的工作著称.在数论方面,他研究了连分数和二次不等式理论,解决了许多难题.在概率论中,他发展了“矩法”扩大了大数律和中心极限定理的应用范围.马尔可夫最重要...

    C#源码-马尔可夫算法.rar

    马尔可夫算法是一种基于概率模型的预测方法,它的核心思想是通过分析一系列事件或文本序列,学习到每个状态(事件)转移到下一个状态的概率。在给定的标题"C#源码-马尔可夫算法.rar"中,我们可以推断出这个压缩包...

Global site tag (gtag.js) - Google Analytics