毎日1つのアルゴリズム(チェーンテーブルの逆順序、サブ文字列などいくつか一緒)
(1)リンクテーブルの順序をアルゴリズムで逆転する.今は再帰式を使わずにやっています.
再帰的な方法で実現されるプロセスは、次のとおりです.
(2)1つのアルゴリズムで1つのループのリンクテーブルにノードを挿入するが,リンクテーブルを通り抜けてはならない.
リンク表を通り抜けるとは何か分かりませんが、ループしないなら、スタートポイントを1つ設定すればいいだけですが、どこに挿入するか分かりません.
(3)文字列を逆さまにする.速度を最適化します.スペースの最適化
(4)サブ文字列が見つかりました.速度を最適化します.空間を最適化します.
利用するSundayアルゴリズム
#include<iostream>
using namespace std;
struct node
{
int x;
node *next;
node()
{
x = 0;
next = NULL;
};
};
void make(node *head)
{
node *hea = head;
for(int i = 0;i<10;i++)
{
node *x = new node;
x->x= i;
hea->next = x;
hea = x;
}
};
void reverse(node *&head)
{
if(head->next == NULL)
return;
node *x = head;
head = head->next;
x->next = NULL;
while(NULL !=head)
{
node *y = head;
head = head->next;
y->next = x;
x = y;
}
head = x;
int i ;
};
int main()
{
node *head = new node;
//head->x = 4;
make(head);
reverse(head);
return 0;
}
再帰的な方法で実現されるプロセスは、次のとおりです.
node* reverse2(node *oldhead,node *newhead = NULL )
{
node *next = oldhead->next;
oldhead->next = newhead;
newhead = oldhead;
return (NULL == next) ? newhead:reverse2(next,newhead);
};
(2)1つのアルゴリズムで1つのループのリンクテーブルにノードを挿入するが,リンクテーブルを通り抜けてはならない.
リンク表を通り抜けるとは何か分かりませんが、ループしないなら、スタートポイントを1つ設定すればいいだけですが、どこに挿入するか分かりません.
(3)文字列を逆さまにする.速度を最適化します.スペースの最適化
void reverseChar(char *str)
{
char *start = str;
int n = strlen(str);
char *p = str+n-1;
while(start < p)
{
char c = *start;
*start = *p;
*p=c;
start++;
p--;
}
}
(4)サブ文字列が見つかりました.速度を最適化します.空間を最適化します.
利用するSundayアルゴリズム
int sunday(const char *src,const char *des)
{
int i,j,pos=0;
int len_s,len_d;
int next[26]={0}; //next ,
len_s=strlen(src);
len_d=strlen(des);
for(j=0;j<26;++j) // next
next[j]=len_d;
for(j=0;j<len_d;++j) // next
next[des[j]-'a']=len_d-j;
while( pos<(len_s-len_d+1) ) //
{
i=pos;
for(j=0;j<len_d;++j,++i) //
{
if(src[i]!=des[j]) // , next
{
pos+=next[src[pos+len_d]-'a'];
break;
}
}
if(j==len_d)
return pos;
}
return -1; // -1
}
int main()
{
char src[]="abcdacdaahfacabcdabcdeaa";
char des[]="abcde";
cout<<sunday(src,des)<<endl;
return 0;
}