几个小算法
来源:互联网 发布:mac 怎么共享 windows 编辑:程序博客网 时间:2024/05/04 07:56
导读:wo
介绍几个小算法:数制转换、数据交换、最大公约数、N次方快速算法、KMP算法。这几个算法在相关数据结构和算法书上都有介绍,这里给出C语言实现例子,供大家参考。(刘爱贵 / Aiguille.LIU)
1、数制转换算法
十进制数N转换为d进制数,根据公式 N = (N div d) * d + N mod d实现 ,堆栈的典型应用。C语言实现如下:
#include "./stack.h"
#include
void conversion(int x, int d)
{
SqStack s;
SElemType e;
InitStack(&s);
while (x) {
Push(&s, x%d);
x = x/d;
}
while(!StackEmpty(&s)) {
Pop(&s, &e);
printf("%d",e);
}
printf("/n");
}
int main(int argc, char *argv[])
{
int x ,d ;
x = atoi(argv[1]);
d = atoi(argv[2]);
conversion(x, d);
}
2、数值交换算法
三种方法:(1)使用临时变量 (2)不使用中间变量,仅使用加法运算 (3)不使用中间变量,使用异或XOR操作。
#include
template
void swap_var(T &a, T &b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}
template
void swap_add(T &a, T &b)
{
a = a - b;
b = a + b;
a = b - a;
}
template
void swap_xor(T &a, T &b)
{
a = a ^ b;
b = b ^ a;
a = a ^ b;
}
int main(int argc, char *argv[])
{
int a, b;
a = atoi(argv[1]);
b = atoi(argv[2]);
swap_var(a, b);
cout<<"swap_var: a="< }
5、KMP串匹配算法
串的模式匹配是串处理系统中的最重要操作之一,普通匹配算法的时间复杂度为O(m*n)。然而,KMP算法的算法时间复杂度为O(m+n),其主要改进是:当出现比较不等时,不需回溯指针,而是利用已经得到的部分匹配的结果将模式向后滑动尽可能远的距离。
KMP算法的本质是基于有限自动机理论,它简化了有限自动机的构造,只考虑当前节点匹配是否成功,即两个分支的走向,成功则j++,失败则转到next[i] 的节点继续。
#include
int* get_nextval(const char *s, int &len)
{
len = strlen(s);
int *next = new int[len];
int i = 0, j = -1;
next[0] = -1;
while(i if (j == -1 || s[i] == s[j]) {
++i;
++j;
if (s[i] != s[j]) {
next[i] = j;
} else {
next[i] = next[j];
}
} else {
j = next[j];
}
}
return next;
}
int KMP(const char *s, const char *t)
{
int slen,tlen;
int i = 0, j = 0;
int *next = get_nextval(t, tlen);
slen = strlen(s);
while(i if(j == -1 || s[i] == t[j]) {
++i;
++j;
} else {
j = next[j];
}
}
delete[] next;
if(j >= tlen)
return i - tlen;
return -1;
}
int main(int argc, char *argv[])
{
char s[128], t[128];
if (argc <3) {
cout<<"Usage: kmp?< exit(-1);
} else {
sprintf(s, "%s", argv[1]);
sprintf(t, "%s", argv[2]);
int pos1 = KMP(s,t);
int pos2 = strstr(s,t) - s;
cout<<"KMP:"< cout<<"strstr:"< }
return 0;
}
本文转自
http://liuaigui.blog.sohu.com/82972626.html
介绍几个小算法:数制转换、数据交换、最大公约数、N次方快速算法、KMP算法。这几个算法在相关数据结构和算法书上都有介绍,这里给出C语言实现例子,供大家参考。(刘爱贵 / Aiguille.LIU)
1、数制转换算法
十进制数N转换为d进制数,根据公式 N = (N div d) * d + N mod d实现 ,堆栈的典型应用。C语言实现如下:
#include "./stack.h"
#include
void conversion(int x, int d)
{
SqStack s;
SElemType e;
InitStack(&s);
while (x) {
Push(&s, x%d);
x = x/d;
}
while(!StackEmpty(&s)) {
Pop(&s, &e);
printf("%d",e);
}
printf("/n");
}
int main(int argc, char *argv[])
{
int x ,d ;
x = atoi(argv[1]);
d = atoi(argv[2]);
conversion(x, d);
}
2、数值交换算法
三种方法:(1)使用临时变量 (2)不使用中间变量,仅使用加法运算 (3)不使用中间变量,使用异或XOR操作。
#include
template
void swap_var(T &a, T &b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}
template
void swap_add(T &a, T &b)
{
a = a - b;
b = a + b;
a = b - a;
}
template
void swap_xor(T &a, T &b)
{
a = a ^ b;
b = b ^ a;
a = a ^ b;
}
int main(int argc, char *argv[])
{
int a, b;
a = atoi(argv[1]);
b = atoi(argv[2]);
swap_var(a, b);
cout<<"swap_var: a="< }
5、KMP串匹配算法
串的模式匹配是串处理系统中的最重要操作之一,普通匹配算法的时间复杂度为O(m*n)。然而,KMP算法的算法时间复杂度为O(m+n),其主要改进是:当出现比较不等时,不需回溯指针,而是利用已经得到的部分匹配的结果将模式向后滑动尽可能远的距离。
KMP算法的本质是基于有限自动机理论,它简化了有限自动机的构造,只考虑当前节点匹配是否成功,即两个分支的走向,成功则j++,失败则转到next[i] 的节点继续。
#include
int* get_nextval(const char *s, int &len)
{
len = strlen(s);
int *next = new int[len];
int i = 0, j = -1;
next[0] = -1;
while(i
++i;
++j;
if (s[i] != s[j]) {
next[i] = j;
} else {
next[i] = next[j];
}
} else {
j = next[j];
}
}
return next;
}
int KMP(const char *s, const char *t)
{
int slen,tlen;
int i = 0, j = 0;
int *next = get_nextval(t, tlen);
slen = strlen(s);
while(i
++i;
++j;
} else {
j = next[j];
}
}
delete[] next;
if(j >= tlen)
return i - tlen;
return -1;
}
int main(int argc, char *argv[])
{
char s[128], t[128];
if (argc <3) {
cout<<"Usage: kmp
} else {
sprintf(s, "%s", argv[1]);
sprintf(t, "%s", argv[2]);
int pos1 = KMP(s,t);
int pos2 = strstr(s,t) - s;
cout<<"KMP:"<
return 0;
}
本文转自
http://liuaigui.blog.sohu.com/82972626.html
- 几个小算法
- 几个小算法
- 几个小算法练习
- 几个小算法
- 几个算法小题目
- 几个注意的小算法
- 几个常见的“算法”小程序
- 使用lua实现几个小算法
- 每天几个小算法,健康生活每一天(一)!
- 每天几个小算法,健康生活每一天(二)!
- 几个算法
- 几个算法
- 几个算法
- 几个算法
- 几个算法
- 几个算法
- 几个小程序
- 几个哲理小故事
- sscanf函数的高级用法 - [C/C++]
- SOA核心理念的应用发展
- 镜像文件制作全过程
- 字节对齐和C/C++函数调用方式学习总结 - [C/C++]
- 汇编基础知识 - [C/C++]
- 几个小算法
- Jack整理的Win32汇编基础知识 - [C/C++]
- VC++ Windows平台字符透明编程大总结 - [C/C++]
- 小記 轉
- GCC编译初步知识 - [C/C++]
- 跟我一起写 Makefile - [UNIX/LINUX]
- C++学习笔记之容器
- J2ME 蓝牙 串口 连接PC
- 用GDB调试程序 - [UNIX/LINUX]