开发者

Need help to improve this largest common substring implementation

I have scanned the web for largest substring implementations to use in my xmlhttp request, however I found that only 1 has worked, in other cases the responsetext hasn't been treated as a string no matter what I have written:

txt = txt + "";  //  or
txt = new string(txt);)

This function works, but it is terrible slow. I am just wondering if you code gurus out there could help me improve this algorithm.

The site that I'm calling a xmlhttprequest is looking like this

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /</title>
 </head>
 <body>
<h1>Index of /</h1>
<ul><li><a href="/"> Parent Directory</a></li>
<li><a href="random"> random/</a></li>
<li><a href="random_2/"> random_1/</a></li>
<li><a href="radnfdom"> random/</a></li>
<li><a href="rasrdndddom_1/"> random_1/</a></li>
<li><a href="random_43"> random/</a></li>
<li><a href="test/"> random_1/</a></li>
</ul>
</body></html> 

In other words you can strip of all the html tags for better speed, I will just search for the plain text in the html text document.

You can watch the script in action here at tdsoft.se

<html>
<head>
<script type="text/javascript">
var txt;
var buildName = "";
var xmlhttp;




function lcs(a, b) {
  var aSub = a.substr(0, a.length-1);
  var bSub = b.substr(0, b.length-1);

  if (a.length == 0 || b.length == 0) {
    return "";
  } else if (a.charAt(a.length-1) == b.charAt(b.length-1)) {
    return lcs(aSub, bSub) + a.charAt(a.length-1);
  } else {
    var x = lcs(a, bSub);
    var y = lcs(aSub, b);
    return (x.length > y.length) ? x : y;
  }
}

function loadXMLDoc(url,cfunc)
开发者_开发百科{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}


function myFunction()
{

    loadXMLDoc("http://tdsoft.se/testni.html",handleXML);


}
var checkState = function(xmlhttp, callback) {

try{
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        callback();
        } 
        else {
            // Check back again 1 sec later
            setTimeout(checkState, 1000);
        }
    }
    catch(err){
        setTimeout(checkState, 1000);
    }
};


function handleXML()
  {
checkState(xmlhttp, function() {

   txt=xmlhttp.responseText;
buildName = "random";
txt = txt.replace(/<&#91;^>&#93;*>/g, "");
var myvar = "";
myvar = lcs(txt, "random");
document.write(myvar);
});
  }
</script>
</head>
<body onLoad="myFunction()">
</body>
</html>


Seems like you would want to take a different approach at this.

I'm not exactly sure the point of what you are trying to do but it seems like something like this would be what you want:

  1. You request a Document
  2. Parse the links in the document and store them in an object keyed by their ids with values being their text
  3. Change your lookup function to go after the link list

Here's a code example (using jQuery for simplicity):

//untested!
var links = {};

function successFunction(data) {
    var aTags = data.find('a');

    aTags.each(function() {
        var $this = $(this);
        links[$this.attr('href')] = $this.text();
    });
}

function lookup(id) {
    return links[id] || '';
}

$.ajax({
    url: 'requestPage.htm',
    success: successFunction
});

EDIT:

If you want to do this non-jquery you can just replace the following things:

  • $.ajax to your XMLHttpRequest method
  • data.find('a') to getElementsByTagName
  • .each(function(){...}) to var i = aTags.length; while(i--) { links[aTags[i].href] = aTags[i].innerHTML; }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜