Hallo,
also ich habe ich die Aufgabe eine Fasta Datei(46000kb) auf Vorkommen von verschiedenen Mustern("TATAA",usw) zu untersuchen und die Anzahl der vergleiche und die Treffer auszugeben.
Generell läuft es alles bei kleinen Dateien...aber es dauert ewig für diese Große. Wie könnte ich da effizienter machen?
Also ich hab 3 Klassen:
die naderen 2 klassen lesen ein und testen.
Ich glaube diesen Anlegen der char[] is ineffizient. Ich hab leider keine Idee.
Danke
also ich habe ich die Aufgabe eine Fasta Datei(46000kb) auf Vorkommen von verschiedenen Mustern("TATAA",usw) zu untersuchen und die Anzahl der vergleiche und die Treffer auszugeben.
Generell läuft es alles bei kleinen Dateien...aber es dauert ewig für diese Große. Wie könnte ich da effizienter machen?
Also ich hab 3 Klassen:
Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
class Sequenz{
private String inhalt;
private String header;
private int counter;
public int getCounter() {
return counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
public Sequenz(String inhalt, String header) {
super();
this.inhalt = inhalt;
this.header = header;
}
public Sequenz() {
super();
}
public String getInhalt() {
return inhalt;
}
public void setInhalt(String inhalt) {
this.inhalt = inhalt;
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
public ArrayList<Integer> naiverAlg(String muster){
char [] inhaltchar = new char[inhalt.length()];
char [] musterchar = new char[muster.length()];
inhalt.getChars(0,inhalt.length(),inhaltchar,0);
muster.getChars(0, muster.length(), musterchar, 0);
ArrayList<Integer> matches = new ArrayList<Integer>();
if(muster=="")
{
return null;
}
if(inhalt =="")
{
return null;
}
if(inhalt.length()< muster.length())
{
return null;
}
boolean full= false;
counter = 0;
for(int i=0; i < inhalt.length()-muster.length();i++){
counter++;
if(inhaltchar[i]== musterchar[0]){
for(int j = 1; j< muster.length();j++){
counter++;
if(musterchar[j]== inhaltchar[i+j]){
full=true;
}
else {
full= false;
break;
}
}
if(full){
matches.add(i);
}
}
}
return matches;
}
public ArrayList<Integer> badCharacterRule(String muster){
char [] inhaltchar = new char[inhalt.length()];
char [] musterchar = new char[muster.length()];
inhalt.getChars(0,inhalt.length(),inhaltchar,0);
muster.getChars(0, muster.length(), musterchar, 0);
ArrayList<Integer> matches = new ArrayList<Integer>();
if(muster=="")
{
return null;
}
if(inhalt =="")
{
return null;
}
if(inhalt.length()< muster.length())
{
return null;
}
int i= muster.length()-1;
boolean full= false;
counter=0;
while(i<inhalt.length())
{ counter++;
if(inhaltchar[i]== musterchar[muster.length()-1]){
int k= muster.length()-2;
for(int j= i-1;j>i-muster.length(); j--){
counter++;
if(inhaltchar[j]==musterchar[k]){
full=true;
}
else{
full=false;
int verschiebung= muster.lastIndexOf(inhaltchar[j]);
if(verschiebung==-1){
verschiebung= muster.length();
}
else{
verschiebung = muster.length()-verschiebung;
}
int temp= i+ verschiebung;
if(i==inhalt.length()-1){break;}
if(temp >= inhalt.length()){
i= inhalt.length()-1;
}
else{
i=temp;
}
break;
}
k--;
}
}
else{
int verschiebung= muster.lastIndexOf(inhaltchar[i]);
if(verschiebung==-1){
verschiebung= muster.length();
}
else{
verschiebung = muster.length()-verschiebung;
}
int temp= i+ verschiebung;
if(i==inhalt.length()-1){break;}
if(temp >= inhalt.length()){
i= inhalt.length()-1;
}
else{
i=temp;
}
}
if(full){
int treffer= i-(muster.length()-1);
i = i+muster.length();
matches.add(treffer);
}
}
return matches;
}
}
die naderen 2 klassen lesen ein und testen.
Ich glaube diesen Anlegen der char[] is ineffizient. Ich hab leider keine Idee.
Danke