国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 馬爾可夫鏈算法(markov算法)的awk、C++、C語言實現代碼

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

2021-01-29 14:12C++教程網 C/C++

這篇文章主要介紹了馬爾可夫鏈算法(markov算法)的awk、C++、C語言實現代碼,需要的朋友可以參考下

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 中有關聯數組,正好可以用來表示前綴和后綴的關系。程序如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# markov.awk: markov chain algorithm for 2-word prefixes
BEGIN { 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 來實現前綴和后綴的對應關系,以此得到較高的開發效率。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* 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 newlines
const int MAXGEN = 10000; // maximum words generated
 
typedef deque<string> Prefix;
 
map<Prefix, vector<string> > statetab; // prefix -> suffixes
 
void    build(Prefix&, istream&);
void    generate(int nwords);
void    add(Prefix&, const string&);
 
// markov main: markov-chain random text generation
int 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 table
void build(Prefix& prefix, istream& in)
{
  string buf;
 
  while (in >> buf)
    add(prefix, buf);
}
 
// add: add word to suffix deque, update prefix
void 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 line
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(); // advance
    prefix.push_back(w);
  }
}

4. c 程序

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/* 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;
  }
}

 

延伸 · 閱讀

精彩推薦
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 精品久久久久久久久久久久久久 | 一区二区三区四区精品 | 婷婷色综合 | 精品一区二区三区在线观看 | 这里只有精品免费 | 亚洲 综合 清纯 丝袜 自拍 | 精品天堂 | 最新国产在线视频 | 波多野结衣福利电影 | 中文在线观看www | 成年人在线免费观看网站 | 日韩中文在线观看 | 成人午夜在线 | 国产精品久久久久久久久久久久午夜片 | 亚洲视频欧美视频 | 快色视频在线观看 | 欧美一级在线 | 欧美亚洲在线 | 91亚洲国产成人久久精品网站 | 日韩综合一区 | 欧美日韩中文字幕在线 | 永久免费av片在线观看全网站 | 中国妞xxx| 久久99精品国产麻豆婷婷洗澡 | 国产尤物一区 | 国产九九精品 | 国产精品久久久久久中文字 | 国产精品一区二区久久 | 国产一区二区精品丝袜 | 日韩视频一区 | 日本在线黄色 | 色.com| 一级特黄录像免费播放全99 | 黄色影院 | 亚洲国产精品久久久久久 | 黄色一级片 | 欧美一区二区三区免费视频 | 精品日韩视频 | 91久久久久久久久久久 | 亚洲狠狠爱一区二区三区 | 99精品欧美一区二区三区综合在线 |