亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

馬爾可夫鏈算法(markov算法)的awk、C++、C語言實現代碼

2020-01-26 15:23:19
字體:
來源:轉載
供稿:網友

1. 問題描述

馬爾可夫鏈算法用于生成一段隨機的英文,其思想非常簡單。首先讀入數據,然后將讀入的數據分成前綴和后綴兩部分,通過前綴來隨機獲取后綴,籍此產生一段可讀的隨機英文。

為了說明方便,假設我們有如下一段話:
 

復制代碼 代碼如下:
   Show your flowcharts and conceal your tables and I will be mystified. Show your tables and your flowcharts will be obvious.
 

假設前綴的長度為2,則我們處理輸入以后得到如下數據,我們首先獲取一個前綴,然后在前綴的后綴列表中隨機選擇一個單詞,然后改變前綴,重復上述過程,這樣,我們產生的句子將是可讀的。

下面是處理過的數據:

復制代碼 代碼如下:

前綴  后綴
show your  flowcharts tables
your flowcharts  and will
flowcharts and  conceal
flowcharts will  be
your tables  and and
will be  mystified. obvious.
be mystified.  show
be obvious.  (end)

處理這個文本的馬爾可夫鏈算法將首先帶引show your,然后隨機取出flowcharts 或者table 兩個單詞,假設選擇的是flowcharts, 則新的前綴就是your flowcharts,同理,選擇table 時,新的前綴就是your table,有了新的前綴your flowcharts 以后,再次隨即選擇它的后綴,這次是在and 和 will 中隨機選擇,重復上述過程,就能夠產生一段可讀的文本。具體描述如下:
復制代碼 代碼如下:

設置 w1 和 w2 為文本的前兩個詞
輸出 w1 和 w2

循環:
    隨機地選出 w3,它是文本中 w1 w2 的后綴中的一個
    打印 w3
    把 w1 和 w2 分別換成 w2 和 w3
    重復循環

2.awk 程序

馬爾可夫鏈算法并不難,我們會在后面看到,用c語言來解決這個問題會相當麻煩,而用awk則只需要5分鐘就能搞定。這簡直就是一個演示awk優點的問題。

awk 中有關聯數組,正好可以用來表示前綴和后綴的關系。程序如下:

# markov.awk: markov chain algorithm for 2-word prefixesBEGIN { MAXGEN = 10000; NONWORD = "/n"; w1 = w2 = NONWORD }{  for (i = 1; i <= NF; i++) {   # read all words    statetab[w1,w2,++nsuffix[w1,w2]] = $i    w1 = w2    w2 = $i  }}END {  statetab[w1,w2,++nsuffix[w1,w2]] = NONWORD # add tail  w1 = w2 = NONWORD  for (i = 0; i < MAXGEN; i++) { # generate    r = int(rand()*nsuffix[w1,w2]) + 1 # nsuffix >= 1    p = statetab[w1,w2,r]    if (p == NONWORD)      exit    print p    w1 = w2     # advance chain    w2 = p  }}  

3. C++ 程序

該問題的主要難點就在于通過前綴隨機的獲取后綴,在C++ 中,我們可以借助map 來實現前綴和后綴的對應關系,以此得到較高的開發效率。

/* Copyright (C) 1999 Lucent Technologies *//* Excerpted from 'The Practice of Programming' *//* by Brian W. Kernighan and Rob Pike */#include <time.h>#include <iostream>#include <string>#include <deque>#include <map>#include <vector>using namespace std;const int NPREF = 2;const char NONWORD[] = "/n";  // cannot appear as real line: we remove newlinesconst int MAXGEN = 10000; // maximum words generatedtypedef deque<string> Prefix;map<Prefix, vector<string> > statetab; // prefix -> suffixesvoid    build(Prefix&, istream&);void    generate(int nwords);void    add(Prefix&, const string&);// markov main: markov-chain random text generationint main(void){  int nwords = MAXGEN;  Prefix prefix; // current input prefix  srand(time(NULL));  for (int i = 0; i < NPREF; i++)    add(prefix, NONWORD);  build(prefix, cin);  add(prefix, NONWORD);  generate(nwords);  return 0;}// build: read input words, build state tablevoid build(Prefix& prefix, istream& in){  string buf;  while (in >> buf)    add(prefix, buf);}// add: add word to suffix deque, update prefixvoid add(Prefix& prefix, const string& s){  if (prefix.size() == NPREF) {    statetab[prefix].push_back(s);    prefix.pop_front();  }  prefix.push_back(s);}// generate: produce output, one word per linevoid 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(); // advance    prefix.push_back(w);  }}

4. c 程序

如果需要程序運行得足夠快,那就只能用較低級的語言來實現了。當我們用c 語言來實現時,就不得不考慮各種各樣的問題了。首先,面臨的第一個問題就是,如何表示前綴和后綴的關系?

這里采用前綴的key,后綴為value 的方式存儲前綴與后綴的關系,我們知道,hash表的查找速度最快,所以,這里采用hash表也是情理之中的事,只是看你能不能想到,用前綴作key,基于上面的思路,再仔細一點,就沒有什么大問題了。

/* Copyright (C) 1999 Lucent Technologies *//* Excerpted from 'The Practice of Programming' *//* by Brian W. Kernighan and Rob Pike *//* * Markov chain random text generator. */#include <string.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <time.h>#include "eprintf.h"enum {  NPREF  = 2,  /* number of prefix words */  NHASH  = 4093, /* size of state hash table array */  MAXGEN = 10000 /* maximum words generated */};typedef struct State State;typedef struct Suffix Suffix;struct State { /* prefix + suffix list */  char  *pref[NPREF];  /* prefix words */  Suffix *suf;      /* list of suffixes */  State  *next;     /* next in hash table */};struct Suffix { /* list of suffixes */  char  *word;     /* suffix */  Suffix *next;     /* next in list of suffixes */};State  *lookup(char *prefix[], int create);void  build(char *prefix[], FILE*);void  generate(int nwords);void  add(char *prefix[], char *word);State  *statetab[NHASH];  /* hash table of states */char NONWORD[] = "/n"; /* cannot appear as real word *//* markov main: markov-chain random text generation */int main(void){  int i, nwords = MAXGEN;  char *prefix[NPREF];    /* current input prefix */  int c;  long seed;  setprogname("markov");  seed = time(NULL);  srand(seed);  for (i = 0; i < NPREF; i++) /* set up initial prefix */    prefix[i] = NONWORD;  build(prefix, stdin);  add(prefix, NONWORD);  generate(nwords);  return 0;}  const int MULTIPLIER = 31; /* for hash() *//* hash: 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. *//* returns 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 *) emalloc(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 *) emalloc(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];  /* create a format string; %s could overflow buf */  sprintf(fmt, "%%%ds", sizeof(buf)-1);  while (fscanf(f, fmt, buf) != EOF)    add(prefix, estrdup(buf));}/* generate: 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, 0);    if (sp == NULL)      eprintf("internal error: lookup failed");    nmatch = 0;    for (suf = sp->suf; suf != NULL; suf = suf->next)      if (rand() % ++nmatch == 0) /* prob = 1/nmatch */        w = suf->word;    if (nmatch == 0)      eprintf("internal error: no suffix %d %s", i, prefix[0]);    if (strcmp(w, NONWORD) == 0)      break;    printf("%s/n", w);    memmove(prefix, prefix+1, (NPREF-1)*sizeof(prefix[0]));    prefix[NPREF-1] = w;  }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩精品在线视频| 久久久精品网站| 国产精品亚洲激情| 亚洲色图50p| zzjj国产精品一区二区| 久久香蕉国产线看观看网| 亚洲在线视频观看| 国产亚洲aⅴaaaaaa毛片| 亚洲韩国青草视频| 国产91露脸中文字幕在线| 日韩电影免费观看在线观看| 久久777国产线看观看精品| 亚洲mm色国产网站| 亚洲一区久久久| 欧美视频在线观看 亚洲欧| 亚洲国产精品va在线观看黑人| 久久久久女教师免费一区| 久久精彩免费视频| 最新中文字幕亚洲| 亚洲黄色在线看| 亚洲午夜精品久久久久久性色| 欧美精品免费在线观看| 久久久久久九九九| 91九色视频导航| 国产精品十八以下禁看| 亚洲人成电影网| 九色成人免费视频| 在线视频欧美日韩精品| 91国产美女在线观看| 久久久亚洲国产天美传媒修理工| 亚洲大胆人体视频| 国产一区二区三区在线播放免费观看| 国产精品入口夜色视频大尺度| 亚洲丁香婷深爱综合| 欧美一级在线播放| 日韩专区在线播放| 黄色91在线观看| 3344国产精品免费看| 欧美裸身视频免费观看| 疯狂做受xxxx欧美肥白少妇| 成人亚洲激情网| 黄色一区二区在线| 日韩成人中文字幕在线观看| 俺去亚洲欧洲欧美日韩| 免费99精品国产自在在线| 亚洲精品女av网站| 久久亚洲精品视频| 青青a在线精品免费观看| 日韩在线视频二区| 黄色精品在线看| 亚洲精品国产精品乱码不99按摩| 国产精品观看在线亚洲人成网| 欧美亚洲另类视频| 日韩视频―中文字幕| 亚洲精品av在线播放| 欧美激情精品久久久久久黑人| 国模gogo一区二区大胆私拍| 亚洲电影免费观看高清完整版在线| 国产精品久久久久久av福利软件| 成人免费观看49www在线观看| 最近2019中文字幕在线高清| 欧美日韩精品国产| 日本a级片电影一区二区| 午夜精品一区二区三区在线视频| 久久精品国亚洲| 日韩中文字幕免费视频| 国产日韩精品在线| 亚洲电影天堂av| 日韩资源在线观看| 欧美大片va欧美在线播放| 久久综合久中文字幕青草| 欧美激情一区二区三区成人| 一区二区欧美久久| 最近2019中文字幕大全第二页| 国产精品扒开腿爽爽爽视频| 热re99久久精品国产66热| 日韩美女在线播放| 欧美老少做受xxxx高潮| 欧美性69xxxx肥| 久久影视电视剧凤归四时歌| 精品无人区太爽高潮在线播放| 亚洲精品suv精品一区二区| 国产精品一区二区性色av| 国产成人短视频| 国产精品高潮呻吟视频| 久久综合九色九九| 奇门遁甲1982国语版免费观看高清| 91久久久久久久一区二区| 欧美日韩亚洲网| 午夜精品一区二区三区av| 国产精品揄拍一区二区| 欧美成人激情图片网| 人体精品一二三区| 欧美午夜影院在线视频| 国产日韩亚洲欧美| 51色欧美片视频在线观看| 久久久久久久久电影| 国产成人黄色av| 91在线播放国产| 久久久天堂国产精品女人| 91精品视频一区| 欧美激情亚洲综合一区| 精品成人国产在线观看男人呻吟| 亚洲va国产va天堂va久久| 日韩在线精品一区| 亚洲第一免费网站| 成人国产亚洲精品a区天堂华泰| 国内精品在线一区| 久久韩剧网电视剧| 久久精视频免费在线久久完整在线看| 日韩精品中文字幕在线观看| 欧美性xxxx18| 亚洲精品www久久久久久广东| 成人a在线视频| 久久人体大胆视频| 亚洲精品av在线播放| 久久久在线视频| 91成人福利在线| 欧美福利小视频| 国产在线观看不卡| 精品在线小视频| 亚洲理论在线a中文字幕| 久久综合久久88| 亚洲欧美国产日韩中文字幕| 精品亚洲aⅴ在线观看| 在线日韩av观看| 久久人人爽国产| 国产日韩欧美在线看| 国产精品久久激情| 奇米一区二区三区四区久久| 国产精品久久久久久久久久东京| 97在线看免费观看视频在线观看| 永久免费精品影视网站| 亚洲欧美成人网| 欧美黑人又粗大| 国产亚洲精品美女久久久久| 草民午夜欧美限制a级福利片| 色一区av在线| 欧美男插女视频| 亚洲精品美女在线| 欧美日韩一区二区在线播放| 人体精品一二三区| 久久久精品国产一区二区| 亚洲全黄一级网站| 亚洲色图50p| 日韩一区二区在线视频| 岛国视频午夜一区免费在线观看| 久久青草福利网站| 欧美日韩国产色视频| 久久成年人视频| 亚洲欧洲国产精品| 一本色道久久综合狠狠躁篇的优点| 国产精品第10页| 色偷偷亚洲男人天堂| 日韩av在线播放资源| 亚洲成人精品久久| 欧美日韩激情小视频| 欧美性猛交xxxx免费看久久久| 91免费视频网站| 欧美激情精品久久久久久免费印度| 亚洲片av在线| 欧美性猛交xxx| 欧美成人国产va精品日本一级| 成人xvideos免费视频|