<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1 20151215//EN" "http://jats.nlm.nih.gov/publishing/1.1/JATS-journalpublishing1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="1.1">
<front>
<journal-meta>
<journal-id journal-id-type="pmc">CMC</journal-id>
<journal-id journal-id-type="nlm-ta">CMC</journal-id>
<journal-id journal-id-type="publisher-id">CMC</journal-id>
<journal-title-group>
<journal-title>Computers, Materials &#x0026; Continua</journal-title>
</journal-title-group>
<issn pub-type="epub">1546-2226</issn><issn pub-type="ppub">1546-2218</issn>
<publisher>
<publisher-name>Tech Science Press</publisher-name>
<publisher-loc>USA</publisher-loc>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">12946</article-id>
<article-id pub-id-type="doi">10.32604/cmc.2020.012946</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Article</subject>
</subj-group>
</article-categories>
<title-group>
<article-title>Fault Tolerant Suffix Trees</article-title><alt-title alt-title-type="left-running-head">Fault Tolerant Suffix Trees</alt-title><alt-title alt-title-type="right-running-head">Fault Tolerant Suffix Trees</alt-title>
</title-group>
<contrib-group content-type="authors">
<contrib id="author-1" contrib-type="author" corresp="yes">
<name name-style="western">
<surname>Ahmad</surname>
<given-names>Iftikhar</given-names>
</name>
<xref ref-type="aff" rid="aff-1">1</xref>
<email>ia@uetpeshawar.edu.pk</email>
</contrib>
<contrib id="author-2" contrib-type="author">
<name name-style="western">
<surname>Shah</surname>
<given-names>Syed Zulfiqar Ali</given-names>
</name>
<xref ref-type="aff" rid="aff-1">1</xref>
</contrib>
<contrib id="author-3" contrib-type="author">
<name name-style="western">
<surname>Shahnaz</surname>
<given-names>Ambreen</given-names>
</name>
<xref ref-type="aff" rid="aff-2">2</xref>
</contrib>
<contrib id="author-4" contrib-type="author">
<name name-style="western">
<surname>Jan</surname>
<given-names>Sadeeq</given-names>
</name>
<xref ref-type="aff" rid="aff-1">1</xref>
</contrib>
<contrib id="author-5" contrib-type="author">
<name name-style="western">
<surname>Noor</surname>
<given-names>Salma</given-names>
</name>
<xref ref-type="aff" rid="aff-2">2</xref>
</contrib>
<contrib id="author-6" contrib-type="author">
<name name-style="western">
<surname>Khalil</surname>
<given-names>Wajeeha</given-names>
</name>
<xref ref-type="aff" rid="aff-1">1</xref>
</contrib>
<contrib id="author-7" contrib-type="author">
<name name-style="western">
<surname>Khan</surname>
<given-names>Fazal Qudus</given-names>
</name>
<xref ref-type="aff" rid="aff-3">3</xref>
</contrib>
<contrib id="author-8" contrib-type="author">
<name name-style="western">
<surname>Khan</surname>
<given-names>Muhammad Iftikhar</given-names>
</name>
<xref ref-type="aff" rid="aff-4">4</xref>
</contrib>
<aff id="aff-1">
<label>1</label><institution>Department of Computer Science and Information Technology, University of Engineering and Technology</institution>, <addr-line>Peshawar, 25120</addr-line>, <country>Pakistan</country></aff>
<aff id="aff-2">
<label>2</label><institution>Department of Computer Science, Shaheed Benazir Bhutto Women University</institution>, <addr-line>Peshawar, 25000</addr-line>, <country>Pakistan</country></aff>
<aff id="aff-3">
<label>3</label><institution>Department of Information Technology</institution>, FCIT, <institution>King Abdulaziz University</institution>, <addr-line>Jeddah</addr-line>, <country>Saudi Arabia</country></aff>
<aff id="aff-4">
<label>4</label><institution>Department of Electrical Engineering, University of Engineering and Technology</institution>, <addr-line>Peshawar, 25120</addr-line>, <country>Pakistan</country></aff>
</contrib-group><author-notes><corresp id="cor1">&#x002A;Corresponding Author: Iftikhar Ahmad. Email:<email>ia@uetpeshawar.edu.pk</email></corresp></author-notes>
<pub-date pub-type="epub" date-type="pub" iso-8601-date="2020-10-30">
<day>30</day>
<month>10</month>
<year>2020</year>
</pub-date>
<volume>66</volume>
<issue>1</issue>
<fpage>157</fpage>
<lpage>164</lpage>
<history>
<date date-type="received">
<day>18</day>
<month>7</month>
<year>2020</year>
</date>
<date date-type="accepted">
<day>19</day>
<month>8</month>
<year>2020</year>
</date>
</history>
<permissions>
<copyright-statement>&#x00A9; 2020 Ahmad et al.</copyright-statement>
<copyright-year>2020</copyright-year>
<copyright-holder>Ahmad et al.</copyright-holder>
<license xlink:href="https://creativecommons.org/licenses/by/4.0/">
<license-p>This work is licensed under a <ext-link ext-link-type="uri" xlink:type="simple" xlink:href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</ext-link>, which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited.</license-p>
</license>
</permissions>
<self-uri content-type="pdf" xlink:href="TSP_CMC_12946.pdf"></self-uri>
<abstract>
<p>Classical algorithms and data structures assume that the underlying memory is reliable, and the data remain safe during or after processing. However, the assumption is perilous as several studies have shown that large and inexpensive memories are vulnerable to bit flips. Thus, the correctness of output of a classical algorithm can be threatened by a few memory faults. Fault tolerant data structures and resilient algorithms are developed to tolerate a limited number of faults and provide a correct output based on the uncorrupted part of the data. Suffix tree is one of the important data structures that has widespread applications including substring search, super string problem and data compression. The fault tolerant version of the suffix tree presented in the literature uses complex techniques of encodable and decodable error-correcting codes, blocked data structures and fault-resistant tries. In this work, we use the natural approach of data replication to develop a fault tolerant suffix tree based on the faulty memory random access machine model. The proposed data structure stores copies of the indices to sustain memory faults injected by an adversary. We develop a resilient version of the Ukkonen&#x2019;s algorithm for constructing the fault tolerant suffix tree and derive an upper bound on the number of corrupt suffixes.</p>
</abstract>
<kwd-group kwd-group-type="author">
<kwd>Resilient data structures</kwd>
<kwd>fault tolerant data structures</kwd>
<kwd>suffix tree</kwd>
</kwd-group>
</article-meta>
</front>
<body>
<sec id="s1">
<label>1</label>
<title>Introduction</title>
<p>Computer memory plays an important role in all Turing-based computational platforms. Modern systems are using memories at multiple levels which consequently increases the need of its correctness [<xref ref-type="bibr" rid="ref-1">1</xref>]. However, memories, at any level, are fragile and can be error-prone, so some sort of healing mechanism is necessary. A fault is an underlying cause of an error, such as a stuck-at bit or high energy particle strike. Faults can be active (causing errors) or dormant (not causing errors) [<xref ref-type="bibr" rid="ref-1">1</xref>]. An error is an incorrect portion of state resulting from an active fault, such as an incorrect value in memory. Faults are predicted to become more frequent in future systems that contain many times more DRAM and SRAM than found in current systems.</p>
<p>Memory faults can compromise the correctness of results. During the execution of an algorithm or during the lifetime of a data structure, it is assumed that the data stored, and data structures built in memory locations are correct and the processing is taking place exactly according to the directions of the algorithm. When memory faults occur, data items stored on memory locations get altered and algorithm is compelled to take wrong steps. Consequently, the results are quite different from the expected results. This can lead to financial loss or even result in more disastrous situations such as in case of avionics applications [<xref ref-type="bibr" rid="ref-2">2</xref>]. The errors can be contained by using the error detection and correction circuitry. But this is an expensive solution in terms of price and performance as additional computational overhead is also added. Another solution can be the use of high performance and reliable memory like memory registers. However, it is too expensive to be used for large applications. Hence these faults need to be taken care of at application level instead of hardware level. Therefore, some recovery or tolerance mechanism is required to guard against these memory faults and ensure the reliability of processing. For this purpose, resilient algorithms or fault-tolerant data structures are designed. A resilient algorithm is the one which can compute a correct output based on uncorrupted values [<xref ref-type="bibr" rid="ref-3">3</xref>]. During the last fifty years several resilient algorithms and fault-tolerant data structures have been presented by the algorithmic community [<xref ref-type="bibr" rid="ref-2">2</xref>].</p>
<p>Suffix tree is an important data structure used for performing substring queries on a given string. Several classical algorithms are available for creating suffix tree for a given string. These algorithms fail when a few memory faults occur. Therefore, in this work, we design a fault tolerant suffix tree based on the natural technique of data replication. We use the Faulty-Memory random access machine model introduced by Finocchi and Italiano [<xref ref-type="bibr" rid="ref-3">3</xref>] to construct a Fault-Tolerant Suffix Tree (FTST). We use <inline-formula id="ieqn-1">
<alternatives><inline-graphic xlink:href="ieqn-1.png"/><tex-math id="tex-ieqn-1"><![CDATA[$\sqrt \sigma$]]></tex-math><mml:math id="mml-ieqn-1"><mml:msqrt><mml:mi>&#x03C3;</mml:mi></mml:msqrt></mml:math>
</alternatives></inline-formula> as duplication function, where <inline-formula id="ieqn-2">
<alternatives><inline-graphic xlink:href="ieqn-2.png"/><tex-math id="tex-ieqn-2"><![CDATA[$\sigma$]]></tex-math><mml:math id="mml-ieqn-2"><mml:mi>&#x03C3;</mml:mi></mml:math>
</alternatives></inline-formula> is an upper bound on memory faults. Instead of duplication actual characters of the string, only the starting index of each edge is duplicated <inline-formula id="ieqn-3">
<alternatives><inline-graphic xlink:href="ieqn-3.png"/><tex-math id="tex-ieqn-3"><![CDATA[$\sqrt \sigma + 1$]]></tex-math><mml:math id="mml-ieqn-3"><mml:msqrt><mml:mi>&#x03C3;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:math>
</alternatives></inline-formula> times. The proposed FTST can tolerate <inline-formula id="ieqn-4">
<alternatives><inline-graphic xlink:href="ieqn-4.png"/><tex-math id="tex-ieqn-4"><![CDATA[$[\left( {\sqrt \sigma + 1{\rm \; }} \right){\rm \; }/{\rm \; }2{\rm \; }] - {\rm \; }1{\rm \; }$]]></tex-math><mml:math id="mml-ieqn-4"><mml:mo stretchy="false">[</mml:mo><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:msqrt><mml:mi>&#x03C3;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:mrow><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:mo>/</mml:mo></mml:mrow><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mn>2</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mo stretchy="false">]</mml:mo><mml:mo>&#x2212;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mn>1</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:math>
</alternatives></inline-formula> faults on each edge of the suffix tree.</p>
<p>Rest of the paper is organized as follows. Section 2 provides a brief overview of the state of the art. Formal problem statement is presented in Section 3. Section 4 presents the proposed Fault Tolerant Suffix Tree (FTST) model, and analysis of the model is performed in the same section. Section 4 concludes the work and provides directions for future research.</p>
</sec>
<sec id="s2">
<label>2</label>
<title>Literature Review</title>
<p>A lot of work has been done in the field of fault-tolerant data structures and resilient algorithms. Large-scale applications process massive data which requires large amount of low-cost memory. Hence fault-tolerance is an important consideration in large systems, safety critical systems and financial institutions&#x2019; systems etc. Computing with unreliable information is a new and interesting area of research. Investigations and explorations have been carried out for coping with the problem of computing with unreliable information in a variety of different settings. For example, liar model [<xref ref-type="bibr" rid="ref-4">4</xref>], fault-tolerant persistent memory programming [<xref ref-type="bibr" rid="ref-5">5</xref>], fault tolerant main memory file systems [<xref ref-type="bibr" rid="ref-6">6</xref>], parallel models of computation with faulty memories [<xref ref-type="bibr" rid="ref-7">7</xref>], and others [<xref ref-type="bibr" rid="ref-8">8</xref>&#x2013;<xref ref-type="bibr" rid="ref-11">11</xref>]. In the following, we summarize key works in the area of fault tolerant algorithms and systems.</p>
<p>Zhang [<xref ref-type="bibr" rid="ref-5">5</xref>] presented Pangolin, which is a fault tolerant persistent object library for NVMM. The proposed library uses a variety of techniques such as parity, checksums and micro-buffering to protect and preserve the objects from errors introduced due to media failure or due to software bugs. Xu et al. [<xref ref-type="bibr" rid="ref-6">6</xref>] proposed a novel non-volatile main memory (NVMM) based file system called NOVA-Fortis. The proposed file system is capable of performing well even in the presence of faulty storage (errors introduced due to corruption) or software bugs. Wang et al. [<xref ref-type="bibr" rid="ref-11">11</xref>] considered the problem of massive health data generation, transmission and collection using various devices, and proposed a interest matching mechanism for efficient, fault tolerant data collection. Jia [<xref ref-type="bibr" rid="ref-12">12</xref>] criticised the stability of traditional systems in the era of big data processing. The author proposed a fault tolerant model using spark application framework for big data clustering in distributed environment.</p>
<p>Finocchi [<xref ref-type="bibr" rid="ref-3">3</xref>] introduced a faulty-memory random access machine model, in which the storage locations may suffer from storage faults. In this model an adversary can alter up to <italic>&#x03C3;</italic> storage locations throughout the execution of an algorithm. This model is used to produce correct output based on uncorrupted values [<xref ref-type="bibr" rid="ref-3">3</xref>,<xref ref-type="bibr" rid="ref-8">8</xref>]. Aumann [<xref ref-type="bibr" rid="ref-9">9</xref>] proposed fault-tolerant Stack, Linked List and General Tree. In their work they have used reconstruction technique. When the faults are detected, the data structure is reconstructed. Finocchi et al. [<xref ref-type="bibr" rid="ref-10">10</xref>] presented resilient search trees to obtain optimal time and space bounds while tolerating up to <inline-formula id="ieqn-5">
<alternatives><inline-graphic xlink:href="ieqn-5.png"/><tex-math id="tex-ieqn-5"><![CDATA[$O\; (\surd logn)$]]></tex-math><mml:math id="mml-ieqn-5"><mml:mi>O</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mo stretchy="false">(</mml:mo><mml:mo stretchy="false">&#x221A;</mml:mo><mml:mi>l</mml:mi><mml:mi>o</mml:mi><mml:mi>g</mml:mi><mml:mi>n</mml:mi><mml:mo stretchy="false">)</mml:mo></mml:math>
</alternatives></inline-formula> memory faults, where <inline-formula id="ieqn-6">
<alternatives><inline-graphic xlink:href="ieqn-6.png"/><tex-math id="tex-ieqn-6"><![CDATA[$n$]]></tex-math><mml:math id="mml-ieqn-6"><mml:mi>n</mml:mi></mml:math>
</alternatives></inline-formula> is the size of search tree.</p>
<p>Weidendorfer et al. [<xref ref-type="bibr" rid="ref-13">13</xref>] proposed LAIK (Lightweight Application-Integration data distribution for parallel worKers) to support fault tolerant features in parallel programming. LAIK has access to data and has the ability to perform various operations such as freeing up the node before failure and assisting in replication for roll back schemes. The authors presented an example by integrating LAIK with other application.</p>
<p>Wang et al. [<xref ref-type="bibr" rid="ref-14">14</xref>] considered the high computational cost and I/O costs incurred during the archiving phase of large graph computation systems and proposed to dynamically adjust checkpoint interval. The resultant procedure not only achieves the required key property of fault tolerance but significantly reduces the high I/O costs as well.</p>
<p>Traditionally, wireless sensor network nodes have low energy storage capacity, resulting in the failure of routing and communication protocols. This can result in power outage in some sensor networks resulting in loss of communication among nodes. Lu [<xref ref-type="bibr" rid="ref-15">15</xref>] addressed the problem by proposing a new algorithm using the structured directional de Brujin graph to improve the fault tolerance of communication protocols in wireless sensor networks. The intuition behind the proposed algorithm is to deploy nodes with high energy to act as super nodes responsible for formation of redundant routing tables.</p>
</sec>
<sec id="s3">
<label>3</label>
<title>Problem Statement</title>
<p>We have a string <inline-formula id="ieqn-7">
<alternatives><inline-graphic xlink:href="ieqn-7.png"/><tex-math id="tex-ieqn-7"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-7"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> containing <inline-formula id="ieqn-8">
<alternatives><inline-graphic xlink:href="ieqn-8.png"/><tex-math id="tex-ieqn-8"><![CDATA[$n$]]></tex-math><mml:math id="mml-ieqn-8"><mml:mi>n</mml:mi></mml:math>
</alternatives></inline-formula> number of characters including <inline-formula id="ieqn-9">
<alternatives><inline-graphic xlink:href="ieqn-9.png"/><tex-math id="tex-ieqn-9"><![CDATA[${\rm \$ }$]]></tex-math><mml:math id="mml-ieqn-9"><mml:mrow><mml:mi mathvariant="normal">$</mml:mi></mml:mrow></mml:math>
</alternatives></inline-formula> symbol as its last character. String <inline-formula id="ieqn-10">
<alternatives><inline-graphic xlink:href="ieqn-10.png"/><tex-math id="tex-ieqn-10"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-10"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> is constituted over a set of alphabets of size <inline-formula id="ieqn-11">
<alternatives><inline-graphic xlink:href="ieqn-11.png"/><tex-math id="tex-ieqn-11"><![CDATA[$c$]]></tex-math><mml:math id="mml-ieqn-11"><mml:mi>c</mml:mi></mml:math>
</alternatives></inline-formula>. A pattern <inline-formula id="ieqn-12">
<alternatives><inline-graphic xlink:href="ieqn-12.png"/><tex-math id="tex-ieqn-12"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-12"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> is any other string of length <inline-formula id="ieqn-13">
<alternatives><inline-graphic xlink:href="ieqn-13.png"/><tex-math id="tex-ieqn-13"><![CDATA[$m$]]></tex-math><mml:math id="mml-ieqn-13"><mml:mi>m</mml:mi></mml:math>
</alternatives></inline-formula>. <inline-formula id="ieqn-14">
<alternatives><inline-graphic xlink:href="ieqn-14.png"/><tex-math id="tex-ieqn-14"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-14"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> is to be checked for substring of <inline-formula id="ieqn-15">
<alternatives><inline-graphic xlink:href="ieqn-15.png"/><tex-math id="tex-ieqn-15"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-15"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula>. The suffix tree data structure can be used for substring queries. The suffix tree built for <inline-formula id="ieqn-16">
<alternatives><inline-graphic xlink:href="ieqn-16.png"/><tex-math id="tex-ieqn-16"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-16"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> contains <inline-formula id="ieqn-17">
<alternatives><inline-graphic xlink:href="ieqn-17.png"/><tex-math id="tex-ieqn-17"><![CDATA[$n$]]></tex-math><mml:math id="mml-ieqn-17"><mml:mi>n</mml:mi></mml:math>
</alternatives></inline-formula> number of suffixes or leaf nodes and <inline-formula id="ieqn-18">
<alternatives><inline-graphic xlink:href="ieqn-18.png"/><tex-math id="tex-ieqn-18"><![CDATA[$c$]]></tex-math><mml:math id="mml-ieqn-18"><mml:mi>c</mml:mi></mml:math>
</alternatives></inline-formula> number of root-originating edges. The total number of edges of suffix tree are represented by <inline-formula id="ieqn-19">
<alternatives><inline-graphic xlink:href="ieqn-19.png"/><tex-math id="tex-ieqn-19"><![CDATA[$e.$]]></tex-math><mml:math id="mml-ieqn-19"><mml:mi>e</mml:mi><mml:mo>.</mml:mo></mml:math>
</alternatives></inline-formula></p>
<p>We are using faulty-memory random access machine model for constructing the Fault Tolerant Suffix Tree. In this model resilient variables are used to achieve resilience capability. A resilient variable duplicates values for safety purpose. This duplication is based on a function of number of corruptions, such as <inline-formula id="ieqn-20">
<alternatives><inline-graphic xlink:href="ieqn-20.png"/><tex-math id="tex-ieqn-20"><![CDATA[$2\delta$]]></tex-math><mml:math id="mml-ieqn-20"><mml:mn>2</mml:mn><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></inline-formula> or <inline-formula id="ieqn-21">
<alternatives><inline-graphic xlink:href="ieqn-21.png"/><tex-math id="tex-ieqn-21"><![CDATA[${\delta ^2}$]]></tex-math><mml:math id="mml-ieqn-21"><mml:mrow><mml:msup><mml:mi>&#x03B4;</mml:mi><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:math>
</alternatives></inline-formula>, where <inline-formula id="ieqn-22">
<alternatives><inline-graphic xlink:href="ieqn-22.png"/><tex-math id="tex-ieqn-22"><![CDATA[$\delta$]]></tex-math><mml:math id="mml-ieqn-22"><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></inline-formula> is an upper bound on the number of corruptions that can be introduced by an adversary. The duplication function <inline-formula id="ieqn-23">
<alternatives><inline-graphic xlink:href="ieqn-23.png"/><tex-math id="tex-ieqn-23"><![CDATA[$df$]]></tex-math><mml:math id="mml-ieqn-23"><mml:mi>d</mml:mi><mml:mi>f</mml:mi></mml:math>
</alternatives></inline-formula>, if not selected cautiously, can decrease the performance of resilient data structures or algorithms in terms of space and running time. Therefore, we have carefully selected <inline-formula id="ieqn-24">
<alternatives><inline-graphic xlink:href="ieqn-24.png"/><tex-math id="tex-ieqn-24"><![CDATA[$df$]]></tex-math><mml:math id="mml-ieqn-24"><mml:mi>d</mml:mi><mml:mi>f</mml:mi></mml:math>
</alternatives></inline-formula> for our <inline-formula id="ieqn-25">
<alternatives><inline-graphic xlink:href="ieqn-25.png"/><tex-math id="tex-ieqn-25"><![CDATA[$FTST$]]></tex-math><mml:math id="mml-ieqn-25"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mi>T</mml:mi></mml:math>
</alternatives></inline-formula> model as <inline-formula id="ieqn-26">
<alternatives><inline-graphic xlink:href="ieqn-26.png"/><tex-math id="tex-ieqn-26"><![CDATA[$\sqrt \delta$]]></tex-math><mml:math id="mml-ieqn-26"><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt></mml:math>
</alternatives></inline-formula>.</p>
<p><bold>Fact 1:</bold> The minimum number of edges <inline-formula id="ieqn-27">
<alternatives><inline-graphic xlink:href="ieqn-27.png"/><tex-math id="tex-ieqn-27"><![CDATA[$e$]]></tex-math><mml:math id="mml-ieqn-27"><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> in a suffix tree is given by <inline-formula id="ieqn-28">
<alternatives><inline-graphic xlink:href="ieqn-28.png"/><tex-math id="tex-ieqn-28"><![CDATA[$e{\rm \; } \ge {\rm \; n}$]]></tex-math><mml:math id="mml-ieqn-28"><mml:mi>e</mml:mi><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mo>&#x2265;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace><mml:mi mathvariant="normal">n</mml:mi></mml:mrow></mml:math>
</alternatives></inline-formula>.</p>
<p><bold>Fact 2:</bold> The maximum number of edges <inline-formula id="ieqn-29">
<alternatives><inline-graphic xlink:href="ieqn-29.png"/><tex-math id="tex-ieqn-29"><![CDATA[$e$]]></tex-math><mml:math id="mml-ieqn-29"><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> in a suffix tree is given by <inline-formula id="ieqn-30">
<alternatives><inline-graphic xlink:href="ieqn-30.png"/><tex-math id="tex-ieqn-30"><![CDATA[$e{\rm \; } \le 2{\rm *n} - {\rm c}.$]]></tex-math><mml:math id="mml-ieqn-30"><mml:mi>e</mml:mi><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mo>&#x2264;</mml:mo><mml:mn>2</mml:mn><mml:mrow><mml:mo>&#x2217;</mml:mo><mml:mi mathvariant="normal">n</mml:mi></mml:mrow><mml:mo>&#x2212;</mml:mo><mml:mrow><mml:mi mathvariant="normal">c</mml:mi></mml:mrow><mml:mo>.</mml:mo></mml:math>
</alternatives></inline-formula></p>
<p><bold>Lemma 1:</bold> <inline-formula id="ieqn-31">
<alternatives><inline-graphic xlink:href="ieqn-31.png"/><tex-math id="tex-ieqn-31"><![CDATA[$\left\lceil \displaystyle{{\sqrt {\rm \delta } + 1} \over 2} \right\rceil$]]></tex-math><mml:math id="mml-ieqn-31"><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> corruptions on a single edge of a suffix tree will leave the value of that edge irreparable.</p>
<p><bold>Proof:</bold> To sustain adversarial faults on an edge, the edge value is duplicated so that if some values are altered, we may still have some correct values remaining. But if half or more of the values are altered, then majority of the values are corrupted and hence the edge value cannot be repaired.</p>
<p><bold>Theorem 1:</bold> The minimum numbers of uncorrupted edges are <inline-formula id="ieqn-32">
<alternatives><inline-graphic xlink:href="ieqn-32.png"/><tex-math id="tex-ieqn-32"><![CDATA[${\rm Max\; }\left( {0,{\rm \; \; n} - {\rm \; } \bigg\lfloor \displaystyle{{2{\rm \; \delta }} \over {\sqrt {\rm \delta } + 1{\rm \; }}}} \bigg\rfloor \right)$]]></tex-math><mml:math id="mml-ieqn-32"><mml:mrow><mml:mi mathvariant="normal">M</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">x</mml:mi><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace><mml:mspace width="thickmathspace"></mml:mspace><mml:mi mathvariant="normal">n</mml:mi></mml:mrow><mml:mo>&#x2212;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mo fence="false" stretchy="false">&#x230A;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mn>2</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>&#x03B4;</mml:mi></mml:mrow></mml:mrow><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:mrow></mml:mfrac></mml:mrow></mml:mstyle></mml:mrow><mml:mo fence="false" stretchy="false">&#x230B;</mml:mo><mml:mo>)</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula></p>
<p><bold>Proof:</bold> We know that the minimum number of edges in a suffix tree is at least <inline-formula id="ieqn-33">
<alternatives><inline-graphic xlink:href="ieqn-33.png"/><tex-math id="tex-ieqn-33"><![CDATA[$n$]]></tex-math><mml:math id="mml-ieqn-33"><mml:mi>n</mml:mi></mml:math>
</alternatives></inline-formula>. From Lemma 1, the maximum number of corrupt edges because of <inline-formula id="ieqn-34">
<alternatives><inline-graphic xlink:href="ieqn-34.png"/><tex-math id="tex-ieqn-34"><![CDATA[$\delta$]]></tex-math><mml:math id="mml-ieqn-34"><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></inline-formula> corruptions, are upper bounded by <inline-formula id="ieqn-35">
<alternatives><inline-graphic xlink:href="ieqn-35.png"/><tex-math id="tex-ieqn-35"><![CDATA[$\left\lfloor \displaystyle{{2{\rm \; }\delta } \over {\sqrt \delta + 1{\rm \; }}} \right\rfloor$]]></tex-math><mml:math id="mml-ieqn-35"><mml:mrow><mml:mo>&#x230A;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mn>2</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mi>&#x03B4;</mml:mi></mml:mrow><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:mrow></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x230B;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula>, therefore, the minimum number of uncorrupted edges are <inline-formula id="ieqn-36">
<alternatives><inline-graphic xlink:href="ieqn-36.png"/><tex-math id="tex-ieqn-36"><![CDATA[$Max{\rm \; }\left( {0,{\rm \; \; }n - {\rm \; }\bigg\lfloor \displaystyle{{2{\rm \; }\delta } \over {\sqrt \delta + 1{\rm \; }}}} \bigg\rfloor \right).$]]></tex-math><mml:math id="mml-ieqn-36"><mml:mi>M</mml:mi><mml:mi>a</mml:mi><mml:mi>x</mml:mi><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mi>n</mml:mi><mml:mo>&#x2212;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mo fence="false" stretchy="false">&#x230A;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mn>2</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mi>&#x03B4;</mml:mi></mml:mrow><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:mrow></mml:mfrac></mml:mrow></mml:mstyle></mml:mrow><mml:mo fence="false" stretchy="false">&#x230B;</mml:mo><mml:mo>)</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:math>
</alternatives></inline-formula></p>
<p><bold>Theorem 2:</bold> For <inline-formula id="ieqn-37">
<alternatives><inline-graphic xlink:href="ieqn-37.png"/><tex-math id="tex-ieqn-37"><![CDATA[${\rm df} = {\rm \; }\sqrt {\rm \delta }$]]></tex-math><mml:math id="mml-ieqn-37"><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:mrow><mml:mo>&#x003D;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt></mml:math>
</alternatives></inline-formula>, <inline-formula id="ieqn-38">
<alternatives><inline-graphic xlink:href="ieqn-38.png"/><tex-math id="tex-ieqn-38"><![CDATA[${\rm \delta } < {\rm \; }\displaystyle{1 \over 8}{\rm \; }\left( {4{\rm e} + {\rm \; }{{\rm e}^2}} \right) + {\rm \; }\displaystyle{1 \over 8}{\rm \; }\left( {\sqrt {8{{\rm e}^3} + {\rm \; }{{\rm e}^4}} } \right)$]]></tex-math><mml:math id="mml-ieqn-38"><mml:mrow><mml:mi>&#x03B4;</mml:mi></mml:mrow><mml:mo>&#x003C;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mstyle scriptlevel="0" displaystyle="true"><mml:mrow><mml:mfrac><mml:mn>1</mml:mn><mml:mn>8</mml:mn></mml:mfrac></mml:mrow><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mn>4</mml:mn><mml:mrow><mml:mi mathvariant="normal">e</mml:mi></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:msup><mml:mrow><mml:mi mathvariant="normal">e</mml:mi></mml:mrow><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:mrow><mml:mo>)</mml:mo></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mstyle scriptlevel="0" displaystyle="true"><mml:mrow><mml:mfrac><mml:mn>1</mml:mn><mml:mn>8</mml:mn></mml:mfrac></mml:mrow><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:msqrt><mml:mn>8</mml:mn><mml:mrow><mml:msup><mml:mrow><mml:mi mathvariant="normal">e</mml:mi></mml:mrow><mml:mn>3</mml:mn></mml:msup></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:msup><mml:mrow><mml:mi mathvariant="normal">e</mml:mi></mml:mrow><mml:mn>4</mml:mn></mml:msup></mml:mrow></mml:msqrt></mml:mrow><mml:mo>)</mml:mo></mml:mrow></mml:mstyle></mml:mstyle></mml:math>
</alternatives></inline-formula> as otherwise an adversary can corrupt all edges beyond repair.</p>
<p>Proof; From Lemma 1, we know that to corrupt the value of an edge, an adversary needs to corrupt <inline-formula id="ieqn-39">
<alternatives><inline-graphic xlink:href="ieqn-39.png"/><tex-math id="tex-ieqn-39"><![CDATA[$\left\lceil \displaystyle{{{\rm df} + 1} \over 2} \right\rceil$]]></tex-math><mml:math id="mml-ieqn-39"><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> copies. Therefore, to corrupt <inline-formula id="ieqn-40">
<alternatives><inline-graphic xlink:href="ieqn-40.png"/><tex-math id="tex-ieqn-40"><![CDATA[${\rm e}$]]></tex-math><mml:math id="mml-ieqn-40"><mml:mrow><mml:mi mathvariant="normal">e</mml:mi></mml:mrow></mml:math>
</alternatives></inline-formula> number of edges, the number of corruptions required is <inline-formula id="ieqn-41">
<alternatives><inline-graphic xlink:href="ieqn-41.png"/><tex-math id="tex-ieqn-41"><![CDATA[$\left\lceil \displaystyle{{{\rm df} + 1} \over 2} \right\rceil{\rm e}$]]></tex-math><mml:math id="mml-ieqn-41"><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow><mml:mrow><mml:mi mathvariant="normal">e</mml:mi></mml:mrow></mml:math>
</alternatives></inline-formula>, i.e., <inline-formula id="ieqn-42">
<alternatives><inline-graphic xlink:href="ieqn-42.png"/><tex-math id="tex-ieqn-42"><![CDATA[${\rm \delta \; } < {\rm \; } \left\lceil \displaystyle{{{\rm df} + 1} \over 2} \right\rceil{\rm e}$]]></tex-math><mml:math id="mml-ieqn-42"><mml:mrow><mml:mi>&#x03B4;</mml:mi><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mo>&#x003C;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow><mml:mrow><mml:mi mathvariant="normal">e</mml:mi></mml:mrow></mml:math>
</alternatives></inline-formula>.</p>
<p>Replacing <inline-formula id="ieqn-43">
<alternatives><inline-graphic xlink:href="ieqn-43.png"/><tex-math id="tex-ieqn-43"><![CDATA[$df = {\rm \; }\sqrt \delta$]]></tex-math><mml:math id="mml-ieqn-43"><mml:mi>d</mml:mi><mml:mi>f</mml:mi><mml:mo>&#x003D;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt></mml:math>
</alternatives></inline-formula>, we obtain;</p>
<p><disp-formula id="eqn-1">
<alternatives>
<graphic mimetype="image" mime-subtype="png" xlink:href="eqn-1.png"/><tex-math id="tex-eqn-1"><![CDATA[$$\delta {\rm \; } < \left( {\displaystyle{{\sqrt \delta {\rm \; } + 1} \over 2}} \right){\rm \; }e$$]]></tex-math><mml:math id="mml-eqn-1" display="block"><mml:mi>&#x03B4;</mml:mi><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mo>&#x003C;</mml:mo><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mstyle scriptlevel="0" displaystyle="true"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle></mml:mrow><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mi>e</mml:mi></mml:math>
</alternatives></disp-formula></p>
<p>Solving we get;</p>
<p><disp-formula id="eqn-2">
<alternatives>
<graphic mimetype="image" mime-subtype="png" xlink:href="eqn-2.png"/><tex-math id="tex-eqn-2"><![CDATA[$$\delta < {\rm \; }\displaystyle{1 \over 8}{\rm \; }\left( {4e + {\rm \; }{e^2}} \right) + {\rm \; }\displaystyle{1 \over 8}{\rm \; }\left( {\sqrt {8{e^3} + {\rm \; }{e^4}} } \right)$$]]></tex-math><mml:math id="mml-eqn-2" display="block"><mml:mi>&#x03B4;</mml:mi><mml:mo>&#x003C;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mstyle scriptlevel="0" displaystyle="true"><mml:mrow><mml:mfrac><mml:mn>1</mml:mn><mml:mn>8</mml:mn></mml:mfrac></mml:mrow><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mn>4</mml:mn><mml:mi>e</mml:mi><mml:mo>&#x002B;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:msup><mml:mi>e</mml:mi><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:mrow><mml:mo>)</mml:mo></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mstyle scriptlevel="0" displaystyle="true"><mml:mrow><mml:mfrac><mml:mn>1</mml:mn><mml:mn>8</mml:mn></mml:mfrac></mml:mrow><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:msqrt><mml:mn>8</mml:mn><mml:mrow><mml:msup><mml:mi>e</mml:mi><mml:mn>3</mml:mn></mml:msup></mml:mrow><mml:mo>&#x002B;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mrow><mml:msup><mml:mi>e</mml:mi><mml:mn>4</mml:mn></mml:msup></mml:mrow></mml:msqrt></mml:mrow><mml:mo>)</mml:mo></mml:mrow></mml:mstyle></mml:mstyle></mml:math>
</alternatives></disp-formula></p>
</sec>
<sec id="s4">
<label>4</label>
<title>Proposed Fault Tolerant Suffix Tree Algorithms</title>
<p>In this section, we present the proposed fault tolerant suffix tree construction and traversing algorithms. The construction algorithm (<xref ref-type="fig" rid="fig-1">Algorithm 1</xref>) is used to construct a fault tolerant suffix tree for string <inline-formula id="ieqn-44">
<alternatives><inline-graphic xlink:href="ieqn-44.png"/><tex-math id="tex-ieqn-44"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-44"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> of length <inline-formula id="ieqn-45">
<alternatives><inline-graphic xlink:href="ieqn-45.png"/><tex-math id="tex-ieqn-45"><![CDATA[$n$]]></tex-math><mml:math id="mml-ieqn-45"><mml:mi>n</mml:mi></mml:math>
</alternatives></inline-formula>. <xref ref-type="fig" rid="fig-2">Algorithm 2</xref> and <xref ref-type="fig" rid="fig-3">Algorithm 3</xref> are used to find a pattern <inline-formula id="ieqn-46">
<alternatives><inline-graphic xlink:href="ieqn-46.png"/><tex-math id="tex-ieqn-46"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-46"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> in string <inline-formula id="ieqn-47">
<alternatives><inline-graphic xlink:href="ieqn-47.png"/><tex-math id="tex-ieqn-47"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-47"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula>.</p>
<fig id="fig-1">
<label>Figure 1</label>
<caption>
<title>fault tolerant suffix tree</title>
</caption>
<graphic mimetype="image" mime-subtype="png" xlink:href="fig-1.png"/>
</fig>
<fig id="fig-2">
<label>Figure 2</label>
<caption>
<title>Traverse Node algorithm</title>
</caption>
<graphic mimetype="image" mime-subtype="png" xlink:href="fig-2.png"/>
</fig>
<fig id="fig-3">
<label>Figure 3</label>
<caption>
<title>Traverse Edge algorithm</title>
</caption>
<graphic mimetype="image" mime-subtype="png" xlink:href="fig-3.png"/>
</fig>
<sec id="s4_1">
<label>4.1</label>
<title>Construction of Fault Tolerant Suffix Tree</title>
<p><xref ref-type="fig" rid="fig-1">Algorithm 1</xref> describes the steps required for the construction of a fault tolerant suffix tree. <xref ref-type="fig" rid="fig-1">Algorithm 1</xref> receives string <inline-formula id="ieqn-48">
<alternatives><inline-graphic xlink:href="ieqn-48.png"/><tex-math id="tex-ieqn-48"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-48"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> as input where <inline-formula id="ieqn-49">
<alternatives><inline-graphic xlink:href="ieqn-49.png"/><tex-math id="tex-ieqn-49"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-49"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> contains $ symbol as its terminating character. <inline-formula id="ieqn-50">
<alternatives><inline-graphic xlink:href="ieqn-50.png"/><tex-math id="tex-ieqn-50"><![CDATA[$n$]]></tex-math><mml:math id="mml-ieqn-50"><mml:mi>n</mml:mi></mml:math>
</alternatives></inline-formula> represents the size of string <inline-formula id="ieqn-51">
<alternatives><inline-graphic xlink:href="ieqn-51.png"/><tex-math id="tex-ieqn-51"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-51"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> and <inline-formula id="ieqn-52">
<alternatives><inline-graphic xlink:href="ieqn-52.png"/><tex-math id="tex-ieqn-52"><![CDATA[$c$]]></tex-math><mml:math id="mml-ieqn-52"><mml:mi>c</mml:mi></mml:math>
</alternatives></inline-formula> the size of its alphabets. These two values <inline-formula id="ieqn-53">
<alternatives><inline-graphic xlink:href="ieqn-53.png"/><tex-math id="tex-ieqn-53"><![CDATA[$n$]]></tex-math><mml:math id="mml-ieqn-53"><mml:mi>n</mml:mi></mml:math>
</alternatives></inline-formula> and <inline-formula id="ieqn-54">
<alternatives><inline-graphic xlink:href="ieqn-54.png"/><tex-math id="tex-ieqn-54"><![CDATA[$c$]]></tex-math><mml:math id="mml-ieqn-54"><mml:mi>c</mml:mi></mml:math>
</alternatives></inline-formula> are used for calculating the possible number of edges <inline-formula id="ieqn-55">
<alternatives><inline-graphic xlink:href="ieqn-55.png"/><tex-math id="tex-ieqn-55"><![CDATA[$e$]]></tex-math><mml:math id="mml-ieqn-55"><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> of the <inline-formula id="ieqn-56">
<alternatives><inline-graphic xlink:href="ieqn-56.png"/><tex-math id="tex-ieqn-56"><![CDATA[$FTST$]]></tex-math><mml:math id="mml-ieqn-56"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mi>T</mml:mi></mml:math>
</alternatives></inline-formula> by using Fact 1. By using Theorem 2, maximum number of corruptions, <inline-formula id="ieqn-57">
<alternatives><inline-graphic xlink:href="ieqn-57.png"/><tex-math id="tex-ieqn-57"><![CDATA[$max$]]></tex-math><mml:math id="mml-ieqn-57"><mml:mi>m</mml:mi><mml:mi>a</mml:mi><mml:mi>x</mml:mi></mml:math>
</alternatives></inline-formula> are calculated beyond which all edges can be corrupted by adversary. Actual number of corruptions <inline-formula id="ieqn-58">
<alternatives><inline-graphic xlink:href="ieqn-58.png"/><tex-math id="tex-ieqn-58"><![CDATA[$\delta$]]></tex-math><mml:math id="mml-ieqn-58"><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></inline-formula> are then randomly selected between <inline-formula id="ieqn-59">
<alternatives><inline-graphic xlink:href="ieqn-59.png"/><tex-math id="tex-ieqn-59"><![CDATA[$1$]]></tex-math><mml:math id="mml-ieqn-59"><mml:mn>1</mml:mn></mml:math>
</alternatives></inline-formula> and <inline-formula id="ieqn-60">
<alternatives><inline-graphic xlink:href="ieqn-60.png"/><tex-math id="tex-ieqn-60"><![CDATA[$max$]]></tex-math><mml:math id="mml-ieqn-60"><mml:mi>m</mml:mi><mml:mi>a</mml:mi><mml:mi>x</mml:mi></mml:math>
</alternatives></inline-formula>. The number of actual corruptions <inline-formula id="ieqn-61">
<alternatives><inline-graphic xlink:href="ieqn-61.png"/><tex-math id="tex-ieqn-61"><![CDATA[$\delta$]]></tex-math><mml:math id="mml-ieqn-61"><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></inline-formula> defines the value of our duplication function <inline-formula id="ieqn-62">
<alternatives><inline-graphic xlink:href="ieqn-62.png"/><tex-math id="tex-ieqn-62"><![CDATA[$df$]]></tex-math><mml:math id="mml-ieqn-62"><mml:mi>d</mml:mi><mml:mi>f</mml:mi></mml:math>
</alternatives></inline-formula>. We are aware that data replication can be very costly in terms of running time and space, therefore, we have carefully selected the <inline-formula id="ieqn-63">
<alternatives><inline-graphic xlink:href="ieqn-63.png"/><tex-math id="tex-ieqn-63"><![CDATA[$df$]]></tex-math><mml:math id="mml-ieqn-63"><mml:mi>d</mml:mi><mml:mi>f</mml:mi></mml:math>
</alternatives></inline-formula> as <inline-formula id="ieqn-64">
<alternatives><inline-graphic xlink:href="ieqn-64.png"/><tex-math id="tex-ieqn-64"><![CDATA[$\sqrt {\rm \delta }$]]></tex-math><mml:math id="mml-ieqn-64"><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt></mml:math>
</alternatives></inline-formula>. <italic>r</italic> represents the duplicate copies plus the original value which will be used to decide the size of array which stores start index of every node of <inline-formula id="ieqn-65">
<alternatives><inline-graphic xlink:href="ieqn-65.png"/><tex-math id="tex-ieqn-65"><![CDATA[$FTST$]]></tex-math><mml:math id="mml-ieqn-65"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mi>T</mml:mi></mml:math>
</alternatives></inline-formula>.</p>
<p><inline-formula id="ieqn-66">
<alternatives><inline-graphic xlink:href="ieqn-66.png"/><tex-math id="tex-ieqn-66"><![CDATA[$FTS{T_i}$]]></tex-math><mml:math id="mml-ieqn-66"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mrow><mml:msub><mml:mi>T</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math>
</alternatives></inline-formula> is the Fault Tolerant Suffix Tree of <inline-formula id="ieqn-67">
<alternatives><inline-graphic xlink:href="ieqn-67.png"/><tex-math id="tex-ieqn-67"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-67"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> which contains characters of <inline-formula id="ieqn-68">
<alternatives><inline-graphic xlink:href="ieqn-68.png"/><tex-math id="tex-ieqn-68"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-68"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> from <inline-formula id="ieqn-69">
<alternatives><inline-graphic xlink:href="ieqn-69.png"/><tex-math id="tex-ieqn-69"><![CDATA[$1$]]></tex-math><mml:math id="mml-ieqn-69"><mml:mn>1</mml:mn></mml:math>
</alternatives></inline-formula> to <inline-formula id="ieqn-70">
<alternatives><inline-graphic xlink:href="ieqn-70.png"/><tex-math id="tex-ieqn-70"><![CDATA[${i^{th}}$]]></tex-math><mml:math id="mml-ieqn-70"><mml:mrow><mml:msup><mml:mi>i</mml:mi><mml:mrow><mml:mi>t</mml:mi><mml:mi>h</mml:mi></mml:mrow></mml:msup></mml:mrow></mml:math>
</alternatives></inline-formula> character. <inline-formula id="ieqn-71">
<alternatives><inline-graphic xlink:href="ieqn-71.png"/><tex-math id="tex-ieqn-71"><![CDATA[$FTS{T_1}$]]></tex-math><mml:math id="mml-ieqn-71"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mrow><mml:msub><mml:mi>T</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math>
</alternatives></inline-formula> is the Fault Tolerant Suffix Tree which contains only the first character of <inline-formula id="ieqn-72">
<alternatives><inline-graphic xlink:href="ieqn-72.png"/><tex-math id="tex-ieqn-72"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-72"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula>. Then by using all the five heuristics of Ukkonen&#x2019;s algorithm, the whole <inline-formula id="ieqn-73">
<alternatives><inline-graphic xlink:href="ieqn-73.png"/><tex-math id="tex-ieqn-73"><![CDATA[$FTST$]]></tex-math><mml:math id="mml-ieqn-73"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mi>T</mml:mi></mml:math>
</alternatives></inline-formula> is constructed. Each child node stores the <inline-formula id="ieqn-74">
<alternatives><inline-graphic xlink:href="ieqn-74.png"/><tex-math id="tex-ieqn-74"><![CDATA[$start$]]></tex-math><mml:math id="mml-ieqn-74"><mml:mi>s</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>t</mml:mi></mml:math>
</alternatives></inline-formula> and <inline-formula id="ieqn-75">
<alternatives><inline-graphic xlink:href="ieqn-75.png"/><tex-math id="tex-ieqn-75"><![CDATA[$end$]]></tex-math><mml:math id="mml-ieqn-75"><mml:mi>e</mml:mi><mml:mi>n</mml:mi><mml:mi>d</mml:mi></mml:math>
</alternatives></inline-formula> index which links it to its parent node. This <inline-formula id="ieqn-76">
<alternatives><inline-graphic xlink:href="ieqn-76.png"/><tex-math id="tex-ieqn-76"><![CDATA[$start \!-\! end$]]></tex-math><mml:math id="mml-ieqn-76"><mml:mi>s</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>t</mml:mi><mml:mo>&#x2212;</mml:mo><mml:mi>e</mml:mi><mml:mi>n</mml:mi><mml:mi>d</mml:mi></mml:math>
</alternatives></inline-formula> pair shows the length of the edge which connects this child to its parent. Each <inline-formula id="ieqn-77">
<alternatives><inline-graphic xlink:href="ieqn-77.png"/><tex-math id="tex-ieqn-77"><![CDATA[$start$]]></tex-math><mml:math id="mml-ieqn-77"><mml:mi>s</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>t</mml:mi></mml:math>
</alternatives></inline-formula> index is a resilient variable which stores the value <inline-formula id="ieqn-78">
<alternatives><inline-graphic xlink:href="ieqn-78.png"/><tex-math id="tex-ieqn-78"><![CDATA[$r\;$]]></tex-math><mml:math id="mml-ieqn-78"><mml:mi>r</mml:mi><mml:mspace width="thickmathspace"></mml:mspace></mml:math>
</alternatives></inline-formula>number of times to provide the resilience capability. The majority of <inline-formula id="ieqn-79">
<alternatives><inline-graphic xlink:href="ieqn-79.png"/><tex-math id="tex-ieqn-79"><![CDATA[$start$]]></tex-math><mml:math id="mml-ieqn-79"><mml:mi>s</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>t</mml:mi></mml:math>
</alternatives></inline-formula> index values decide its correctness or otherwise.</p>
</sec>
<sec id="s4_2">
<label>4.2</label>
<title>Searching for Pattern P in Fault Tolerant Suffix Tree</title>
<p><xref ref-type="fig" rid="fig-2">Algorithm 2</xref> and <xref ref-type="fig" rid="fig-3">Algorithm 3</xref> are proposed to search for pattern P in the fault tolerant suffix tree constructed by <xref ref-type="fig" rid="fig-1">Algorithm 1</xref>. The algorithms and the required explanation is provided in the text below.</p>
<p><xref ref-type="fig" rid="fig-2">Algorithm 2</xref> (<inline-formula id="ieqn-80">
<alternatives><inline-graphic xlink:href="ieqn-80.png"/><tex-math id="tex-ieqn-80"><![CDATA[$Traverse\; Node$]]></tex-math><mml:math id="mml-ieqn-80"><mml:mi>T</mml:mi><mml:mi>r</mml:mi><mml:mi>a</mml:mi><mml:mi>v</mml:mi><mml:mi>e</mml:mi><mml:mi>r</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>N</mml:mi><mml:mi>o</mml:mi><mml:mi>d</mml:mi><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula>) receives three parameters, a node <inline-formula id="ieqn-81">
<alternatives><inline-graphic xlink:href="ieqn-81.png"/><tex-math id="tex-ieqn-81"><![CDATA[$N$]]></tex-math><mml:math id="mml-ieqn-81"><mml:mi>N</mml:mi></mml:math>
</alternatives></inline-formula> of <inline-formula id="ieqn-82">
<alternatives><inline-graphic xlink:href="ieqn-82.png"/><tex-math id="tex-ieqn-82"><![CDATA[$FTST$]]></tex-math><mml:math id="mml-ieqn-82"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mi>T</mml:mi></mml:math>
</alternatives></inline-formula>, a pattern <inline-formula id="ieqn-83">
<alternatives><inline-graphic xlink:href="ieqn-83.png"/><tex-math id="tex-ieqn-83"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-83"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> and an integer value <inline-formula id="ieqn-84">
<alternatives><inline-graphic xlink:href="ieqn-84.png"/><tex-math id="tex-ieqn-84"><![CDATA[$x$]]></tex-math><mml:math id="mml-ieqn-84"><mml:mi>x</mml:mi></mml:math>
</alternatives></inline-formula> which is used as index of pattern <inline-formula id="ieqn-85">
<alternatives><inline-graphic xlink:href="ieqn-85.png"/><tex-math id="tex-ieqn-85"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-85"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula>. <inline-formula id="ieqn-86">
<alternatives><inline-graphic xlink:href="ieqn-86.png"/><tex-math id="tex-ieqn-86"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-86"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> is another string of length <inline-formula id="ieqn-87">
<alternatives><inline-graphic xlink:href="ieqn-87.png"/><tex-math id="tex-ieqn-87"><![CDATA[$m$]]></tex-math><mml:math id="mml-ieqn-87"><mml:mi>m</mml:mi></mml:math>
</alternatives></inline-formula> and is globally accessible in all algorithms. <italic>P</italic> is to be searched within <inline-formula id="ieqn-88">
<alternatives><inline-graphic xlink:href="ieqn-88.png"/><tex-math id="tex-ieqn-88"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-88"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula>. <inline-formula id="ieqn-89">
<alternatives><inline-graphic xlink:href="ieqn-89.png"/><tex-math id="tex-ieqn-89"><![CDATA[$Traverse\; Node$]]></tex-math><mml:math id="mml-ieqn-89"><mml:mi>T</mml:mi><mml:mi>r</mml:mi><mml:mi>a</mml:mi><mml:mi>v</mml:mi><mml:mi>e</mml:mi><mml:mi>r</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>N</mml:mi><mml:mi>o</mml:mi><mml:mi>d</mml:mi><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> algorithm traverses its edge and stores the returned value in result. A <inline-formula id="ieqn-90">
<alternatives><inline-graphic xlink:href="ieqn-90.png"/><tex-math id="tex-ieqn-90"><![CDATA[$1$]]></tex-math><mml:math id="mml-ieqn-90"><mml:mn>1</mml:mn></mml:math>
</alternatives></inline-formula> shows success while <inline-formula id="ieqn-91">
<alternatives><inline-graphic xlink:href="ieqn-91.png"/><tex-math id="tex-ieqn-91"><![CDATA[$- 1$]]></tex-math><mml:math id="mml-ieqn-91"><mml:mo>&#x2212;</mml:mo><mml:mn>1</mml:mn></mml:math>
</alternatives></inline-formula> shows failure of search. Variable <inline-formula id="ieqn-92">
<alternatives><inline-graphic xlink:href="ieqn-92.png"/><tex-math id="tex-ieqn-92"><![CDATA[$x$]]></tex-math><mml:math id="mml-ieqn-92"><mml:mi>x</mml:mi></mml:math>
</alternatives></inline-formula> is incremented by the length of edge. The character of <inline-formula id="ieqn-93">
<alternatives><inline-graphic xlink:href="ieqn-93.png"/><tex-math id="tex-ieqn-93"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-93"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> at <inline-formula id="ieqn-94">
<alternatives><inline-graphic xlink:href="ieqn-94.png"/><tex-math id="tex-ieqn-94"><![CDATA[$x$]]></tex-math><mml:math id="mml-ieqn-94"><mml:mi>x</mml:mi></mml:math>
</alternatives></inline-formula> is used as index for identifying among children nodes of <inline-formula id="ieqn-95">
<alternatives><inline-graphic xlink:href="ieqn-95.png"/><tex-math id="tex-ieqn-95"><![CDATA[$N$]]></tex-math><mml:math id="mml-ieqn-95"><mml:mi>N</mml:mi></mml:math>
</alternatives></inline-formula>. <inline-formula id="ieqn-96">
<alternatives><inline-graphic xlink:href="ieqn-96.png"/><tex-math id="tex-ieqn-96"><![CDATA[$N$]]></tex-math><mml:math id="mml-ieqn-96"><mml:mi>N</mml:mi></mml:math>
</alternatives></inline-formula> recursively calls its valid child node and proceeds.</p>
<p><inline-formula id="ieqn-97">
<alternatives><inline-graphic xlink:href="ieqn-97.png"/><tex-math id="tex-ieqn-97"><![CDATA[$Traverse\; Node$]]></tex-math><mml:math id="mml-ieqn-97"><mml:mi>T</mml:mi><mml:mi>r</mml:mi><mml:mi>a</mml:mi><mml:mi>v</mml:mi><mml:mi>e</mml:mi><mml:mi>r</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>N</mml:mi><mml:mi>o</mml:mi><mml:mi>d</mml:mi><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> algorithm calls <inline-formula id="ieqn-98">
<alternatives><inline-graphic xlink:href="ieqn-98.png"/><tex-math id="tex-ieqn-98"><![CDATA[$Traverse\; Edge$]]></tex-math><mml:math id="mml-ieqn-98"><mml:mi>T</mml:mi><mml:mi>r</mml:mi><mml:mi>a</mml:mi><mml:mi>v</mml:mi><mml:mi>e</mml:mi><mml:mi>r</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>E</mml:mi><mml:mi>d</mml:mi><mml:mi>g</mml:mi><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> (<xref ref-type="fig" rid="fig-3">Algorithm 3</xref>) to explore the edge which links <inline-formula id="ieqn-99">
<alternatives><inline-graphic xlink:href="ieqn-99.png"/><tex-math id="tex-ieqn-99"><![CDATA[$N$]]></tex-math><mml:math id="mml-ieqn-99"><mml:mi>N</mml:mi></mml:math>
</alternatives></inline-formula> to its parent node. During this exploration, corresponding characters of the pattern <inline-formula id="ieqn-100">
<alternatives><inline-graphic xlink:href="ieqn-100.png"/><tex-math id="tex-ieqn-100"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-100"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> are compared with characters stored on this edge. If <inline-formula id="ieqn-101">
<alternatives><inline-graphic xlink:href="ieqn-101.png"/><tex-math id="tex-ieqn-101"><![CDATA[$1$]]></tex-math><mml:math id="mml-ieqn-101"><mml:mn>1</mml:mn></mml:math>
</alternatives></inline-formula> is received from <inline-formula id="ieqn-102">
<alternatives><inline-graphic xlink:href="ieqn-102.png"/><tex-math id="tex-ieqn-102"><![CDATA[$Traverse\; Edge$]]></tex-math><mml:math id="mml-ieqn-102"><mml:mi>T</mml:mi><mml:mi>r</mml:mi><mml:mi>a</mml:mi><mml:mi>v</mml:mi><mml:mi>e</mml:mi><mml:mi>r</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>E</mml:mi><mml:mi>d</mml:mi><mml:mi>g</mml:mi><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> algorithm, then it shows that pattern <inline-formula id="ieqn-103">
<alternatives><inline-graphic xlink:href="ieqn-103.png"/><tex-math id="tex-ieqn-103"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-103"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> is successfully found in string <inline-formula id="ieqn-104">
<alternatives><inline-graphic xlink:href="ieqn-104.png"/><tex-math id="tex-ieqn-104"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-104"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula>. If <inline-formula id="ieqn-105">
<alternatives><inline-graphic xlink:href="ieqn-105.png"/><tex-math id="tex-ieqn-105"><![CDATA[$0$]]></tex-math><mml:math id="mml-ieqn-105"><mml:mn>0</mml:mn></mml:math>
</alternatives></inline-formula> is received from <inline-formula id="ieqn-106">
<alternatives><inline-graphic xlink:href="ieqn-106.png"/><tex-math id="tex-ieqn-106"><![CDATA[$Traverse\; Edge$]]></tex-math><mml:math id="mml-ieqn-106"><mml:mi>T</mml:mi><mml:mi>r</mml:mi><mml:mi>a</mml:mi><mml:mi>v</mml:mi><mml:mi>e</mml:mi><mml:mi>r</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>E</mml:mi><mml:mi>d</mml:mi><mml:mi>g</mml:mi><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> algorithm, then it means that comparison is successful on this edge but is incomplete and the remaining part needs to be explored further. To explore the deeper edge, linking this child <inline-formula id="ieqn-107">
<alternatives><inline-graphic xlink:href="ieqn-107.png"/><tex-math id="tex-ieqn-107"><![CDATA[$N$]]></tex-math><mml:math id="mml-ieqn-107"><mml:mi>N</mml:mi></mml:math>
</alternatives></inline-formula> to its sub-child, <inline-formula id="ieqn-108">
<alternatives><inline-graphic xlink:href="ieqn-108.png"/><tex-math id="tex-ieqn-108"><![CDATA[$Traverse\; Node$]]></tex-math><mml:math id="mml-ieqn-108"><mml:mi>T</mml:mi><mml:mi>r</mml:mi><mml:mi>a</mml:mi><mml:mi>v</mml:mi><mml:mi>e</mml:mi><mml:mi>r</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>N</mml:mi><mml:mi>o</mml:mi><mml:mi>d</mml:mi><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula> algorithm recursively calls itself. Any value other than <inline-formula id="ieqn-109">
<alternatives><inline-graphic xlink:href="ieqn-109.png"/><tex-math id="tex-ieqn-109"><![CDATA[$0$]]></tex-math><mml:math id="mml-ieqn-109"><mml:mn>0</mml:mn></mml:math>
</alternatives></inline-formula> or <inline-formula id="ieqn-110">
<alternatives><inline-graphic xlink:href="ieqn-110.png"/><tex-math id="tex-ieqn-110"><![CDATA[$1$]]></tex-math><mml:math id="mml-ieqn-110"><mml:mn>1</mml:mn></mml:math>
</alternatives></inline-formula> indicates that pattern <inline-formula id="ieqn-111">
<alternatives><inline-graphic xlink:href="ieqn-111.png"/><tex-math id="tex-ieqn-111"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-111"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> is not a substring of <inline-formula id="ieqn-112">
<alternatives><inline-graphic xlink:href="ieqn-112.png"/><tex-math id="tex-ieqn-112"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-112"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula>.</p>
<p><xref ref-type="fig" rid="fig-3">Algorithm 3</xref> (<inline-formula id="ieqn-113">
<alternatives><inline-graphic xlink:href="ieqn-113.png"/><tex-math id="tex-ieqn-113"><![CDATA[$Traverse\; Edge$]]></tex-math><mml:math id="mml-ieqn-113"><mml:mi>T</mml:mi><mml:mi>r</mml:mi><mml:mi>a</mml:mi><mml:mi>v</mml:mi><mml:mi>e</mml:mi><mml:mi>r</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>E</mml:mi><mml:mi>d</mml:mi><mml:mi>g</mml:mi><mml:mi>e</mml:mi></mml:math>
</alternatives></inline-formula>) receives four parameters, a pattern <inline-formula id="ieqn-114">
<alternatives><inline-graphic xlink:href="ieqn-114.png"/><tex-math id="tex-ieqn-114"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-114"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> to be searched, an integer <inline-formula id="ieqn-115">
<alternatives><inline-graphic xlink:href="ieqn-115.png"/><tex-math id="tex-ieqn-115"><![CDATA[$x$]]></tex-math><mml:math id="mml-ieqn-115"><mml:mi>x</mml:mi></mml:math>
</alternatives></inline-formula> which represents the index of pattern <inline-formula id="ieqn-116">
<alternatives><inline-graphic xlink:href="ieqn-116.png"/><tex-math id="tex-ieqn-116"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-116"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula>, an array of integers <inline-formula id="ieqn-117">
<alternatives><inline-graphic xlink:href="ieqn-117.png"/><tex-math id="tex-ieqn-117"><![CDATA[$start[\;]$]]></tex-math><mml:math id="mml-ieqn-117"><mml:mi>s</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>t</mml:mi><mml:mo stretchy="false">[</mml:mo><mml:mo stretchy="false">]</mml:mo></mml:math>
</alternatives></inline-formula> representing the starting index of node and integer variable <inline-formula id="ieqn-118">
<alternatives><inline-graphic xlink:href="ieqn-118.png"/><tex-math id="tex-ieqn-118"><![CDATA[$end$]]></tex-math><mml:math id="mml-ieqn-118"><mml:mi>e</mml:mi><mml:mi>n</mml:mi><mml:mi>d</mml:mi></mml:math>
</alternatives></inline-formula> representing end index of node. Integer variable <inline-formula id="ieqn-119">
<alternatives><inline-graphic xlink:href="ieqn-119.png"/><tex-math id="tex-ieqn-119"><![CDATA[$k$]]></tex-math><mml:math id="mml-ieqn-119"><mml:mi>k</mml:mi></mml:math>
</alternatives></inline-formula> is used as index of string <inline-formula id="ieqn-120">
<alternatives><inline-graphic xlink:href="ieqn-120.png"/><tex-math id="tex-ieqn-120"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-120"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula> and <inline-formula id="ieqn-121">
<alternatives><inline-graphic xlink:href="ieqn-121.png"/><tex-math id="tex-ieqn-121"><![CDATA[$x$]]></tex-math><mml:math id="mml-ieqn-121"><mml:mi>x</mml:mi></mml:math>
</alternatives></inline-formula> of <inline-formula id="ieqn-122">
<alternatives><inline-graphic xlink:href="ieqn-122.png"/><tex-math id="tex-ieqn-122"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-122"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula>. If corresponding characters are not equal, -1 is returned indicating failure of searching. Every node of <inline-formula id="ieqn-123">
<alternatives><inline-graphic xlink:href="ieqn-123.png"/><tex-math id="tex-ieqn-123"><![CDATA[$FTST$]]></tex-math><mml:math id="mml-ieqn-123"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mi>T</mml:mi></mml:math>
</alternatives></inline-formula> stores a pair of indices start and end, which stores the start and end index of the edge linking this node to its parent node, respectively. In order to achieve resilience capability, the <inline-formula id="ieqn-124">
<alternatives><inline-graphic xlink:href="ieqn-124.png"/><tex-math id="tex-ieqn-124"><![CDATA[$FTST$]]></tex-math><mml:math id="mml-ieqn-124"><mml:mi>F</mml:mi><mml:mi>T</mml:mi><mml:mi>S</mml:mi><mml:mi>T</mml:mi></mml:math>
</alternatives></inline-formula> stores the start index value <inline-formula id="ieqn-125">
<alternatives><inline-graphic xlink:href="ieqn-125.png"/><tex-math id="tex-ieqn-125"><![CDATA[$r$]]></tex-math><mml:math id="mml-ieqn-125"><mml:mi>r</mml:mi></mml:math>
</alternatives></inline-formula> times in an array, <inline-formula id="ieqn-126">
<alternatives><inline-graphic xlink:href="ieqn-126.png"/><tex-math id="tex-ieqn-126"><![CDATA[$start\left[ \; \right]$]]></tex-math><mml:math id="mml-ieqn-126"><mml:mi>s</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>t</mml:mi><mml:mrow><mml:mo>[</mml:mo><mml:mspace width="thickmathspace"></mml:mspace><mml:mo>]</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula>, of size <inline-formula id="ieqn-127">
<alternatives><inline-graphic xlink:href="ieqn-127.png"/><tex-math id="tex-ieqn-127"><![CDATA[$r$]]></tex-math><mml:math id="mml-ieqn-127"><mml:mi>r</mml:mi></mml:math>
</alternatives></inline-formula>. <inline-formula id="ieqn-128">
<alternatives><inline-graphic xlink:href="ieqn-128.png"/><tex-math id="tex-ieqn-128"><![CDATA[$t$]]></tex-math><mml:math id="mml-ieqn-128"><mml:mi>t</mml:mi></mml:math>
</alternatives></inline-formula> stores the start index value. <inline-formula id="ieqn-129">
<alternatives><inline-graphic xlink:href="ieqn-129.png"/><tex-math id="tex-ieqn-129"><![CDATA[$t$]]></tex-math><mml:math id="mml-ieqn-129"><mml:mi>t</mml:mi></mml:math>
</alternatives></inline-formula> receives its value by calling <inline-formula id="ieqn-130">
<alternatives><inline-graphic xlink:href="ieqn-130.png"/><tex-math id="tex-ieqn-130"><![CDATA[$Check\; Index$]]></tex-math><mml:math id="mml-ieqn-130"><mml:mi>C</mml:mi><mml:mi>h</mml:mi><mml:mi>e</mml:mi><mml:mi>c</mml:mi><mml:mi>k</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>I</mml:mi><mml:mi>n</mml:mi><mml:mi>d</mml:mi><mml:mi>e</mml:mi><mml:mi>x</mml:mi></mml:math>
</alternatives></inline-formula> algorithm which finds a value in majority.</p>
<p>After the while loop, <inline-formula id="ieqn-131">
<alternatives><inline-graphic xlink:href="ieqn-131.png"/><tex-math id="tex-ieqn-131"><![CDATA[$1$]]></tex-math><mml:math id="mml-ieqn-131"><mml:mn>1</mml:mn></mml:math>
</alternatives></inline-formula> is returned to indicate that comparison has remained successful till the end of pattern <inline-formula id="ieqn-132">
<alternatives><inline-graphic xlink:href="ieqn-132.png"/><tex-math id="tex-ieqn-132"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-132"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula>, hence <inline-formula id="ieqn-133">
<alternatives><inline-graphic xlink:href="ieqn-133.png"/><tex-math id="tex-ieqn-133"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-133"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> is a substring of <inline-formula id="ieqn-134">
<alternatives><inline-graphic xlink:href="ieqn-134.png"/><tex-math id="tex-ieqn-134"><![CDATA[$S$]]></tex-math><mml:math id="mml-ieqn-134"><mml:mi>S</mml:mi></mml:math>
</alternatives></inline-formula>. If comparison between the corresponding characters remained successful but the end of pattern <inline-formula id="ieqn-135">
<alternatives><inline-graphic xlink:href="ieqn-135.png"/><tex-math id="tex-ieqn-135"><![CDATA[$P$]]></tex-math><mml:math id="mml-ieqn-135"><mml:mi>P</mml:mi></mml:math>
</alternatives></inline-formula> has not reached so far, then it means that further match must be searched in the sub-child of this node. To signal this phenomenon, 0 is returned.</p>
</sec>
<sec id="s4_3">
<label>4.3</label>
<title>Analysis of the Proposed Model</title>
<p>In this section, we compute the maximum number of edges that can be corrupted by an adversary, as well as the number of corruptions required by an adversary to corrupt root-originating edges.</p>
<p><bold>Theorem 3:</bold> If <inline-formula id="ieqn-136">
<alternatives><inline-graphic xlink:href="ieqn-136.png"/><tex-math id="tex-ieqn-136"><![CDATA[$df = {\rm \; }\sqrt \delta$]]></tex-math><mml:math id="mml-ieqn-136"><mml:mi>d</mml:mi><mml:mi>f</mml:mi><mml:mo>&#x003D;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt></mml:math>
</alternatives></inline-formula>, then the maximum number of edges that can be corrupted by an adversary is no more than <inline-formula id="ieqn-137">
<alternatives><inline-graphic xlink:href="ieqn-137.png"/><tex-math id="tex-ieqn-137"><![CDATA[$\left\lfloor \displaystyle{{2{\rm \; }\delta } \over {\sqrt \delta + 1{\rm \; }}} \right\rfloor$]]></tex-math><mml:math id="mml-ieqn-137"><mml:mrow><mml:mo>&#x230A;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mn>2</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mi>&#x03B4;</mml:mi></mml:mrow><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:mrow></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x230B;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula></p>
<p><bold>Proof:</bold> We know that a single edge can be corrupted beyond repair if  <inline-formula id="ieqn-138">
<alternatives><inline-graphic xlink:href="ieqn-138.png"/><tex-math id="tex-ieqn-138"><![CDATA[$\displaystyle{{df + 1} \over 2}$]]></tex-math><mml:math id="mml-ieqn-138"><mml:mstyle scriptlevel="0" displaystyle="true"><mml:mrow><mml:mfrac><mml:mrow><mml:mi>d</mml:mi><mml:mi>f</mml:mi><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle></mml:math>
</alternatives></inline-formula> copies are corrupted. In our case, <inline-formula id="ieqn-139">
<alternatives><inline-graphic xlink:href="ieqn-139.png"/><tex-math id="tex-ieqn-139"><![CDATA[$df = {\rm \; }\sqrt \delta$]]></tex-math><mml:math id="mml-ieqn-139"><mml:mi>d</mml:mi><mml:mi>f</mml:mi><mml:mo>&#x003D;</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt></mml:math>
</alternatives></inline-formula>, which means <inline-formula id="ieqn-140">
<alternatives><inline-graphic xlink:href="ieqn-140.png"/><tex-math id="tex-ieqn-140"><![CDATA[$\left\lceil \displaystyle{{\sqrt \delta + 1} \over 2} \right\rceil$]]></tex-math><mml:math id="mml-ieqn-140"><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> corruptions will leave an edge value irreparable (Lemma 3). Alternatively, <inline-formula id="ieqn-141">
<alternatives><inline-graphic xlink:href="ieqn-141.png"/><tex-math id="tex-ieqn-141"><![CDATA[$\left\lceil \displaystyle{{\sqrt \delta + 1} \over 2} \right\rceil$]]></tex-math><mml:math id="mml-ieqn-141"><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> corruptions cause a single edge corruption, therefore, by using basic mathematics, <inline-formula id="ieqn-142">
<alternatives><inline-graphic xlink:href="ieqn-142.png"/><tex-math id="tex-ieqn-142"><![CDATA[$\delta$]]></tex-math><mml:math id="mml-ieqn-142"><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></inline-formula> corruptions will cause at maximum <inline-formula id="ieqn-143">
<alternatives><inline-graphic xlink:href="ieqn-143.png"/><tex-math id="tex-ieqn-143"><![CDATA[$\left\lfloor \displaystyle{{2{\rm \; }\delta } \over {\sqrt \delta + 1{\rm \; }}} \right\rfloor$]]></tex-math><mml:math id="mml-ieqn-143"><mml:mrow><mml:mo>&#x230A;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mn>2</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mi>&#x03B4;</mml:mi></mml:mrow><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:mrow></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x230B;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> edges beyond repair.</p>
<p>Since a suffix can consists of more than one edges, therefore, at maximum <inline-formula id="ieqn-144">
<alternatives><inline-graphic xlink:href="ieqn-144.png"/><tex-math id="tex-ieqn-144"><![CDATA[$\left\lfloor \displaystyle{{2{\rm \; }\delta } \over {\sqrt \delta + 1{\rm \; }}} \right\rfloor$]]></tex-math><mml:math id="mml-ieqn-144"><mml:mrow><mml:mo>&#x230A;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mn>2</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow><mml:mi>&#x03B4;</mml:mi></mml:mrow><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:mrow></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x230B;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> suffixes can be corrupted in a suffix tree with <inline-formula id="ieqn-145">
<alternatives><inline-graphic xlink:href="ieqn-145.png"/><tex-math id="tex-ieqn-145"><![CDATA[$\delta$]]></tex-math><mml:math id="mml-ieqn-145"><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></inline-formula> number of memory faults.</p>
<p><bold>Theorem 4:</bold> To corrupt all root-originating edges, a minimum of <inline-formula id="ieqn-146">
<alternatives><inline-graphic xlink:href="ieqn-146.png"/><tex-math id="tex-ieqn-146"><![CDATA[$\; \left| c \right|\; \left( {\displaystyle{{\sqrt \delta + 1} \over 2}} \right)$]]></tex-math><mml:math id="mml-ieqn-146"><mml:mspace width="thickmathspace"></mml:mspace><mml:mrow><mml:mo>|</mml:mo><mml:mi>c</mml:mi><mml:mo>|</mml:mo></mml:mrow><mml:mspace width="thickmathspace"></mml:mspace><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mstyle scriptlevel="0" displaystyle="true"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle></mml:mrow><mml:mo>)</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> corruptions are required, provided that <inline-formula id="ieqn-147">
<alternatives><inline-graphic xlink:href="ieqn-147.png"/><tex-math id="tex-ieqn-147"><![CDATA[$\; \left| c \right|\; \le \; \left( {\; \displaystyle{{2\; \delta } \over {\sqrt \delta + 1}}\; } \right)$]]></tex-math><mml:math id="mml-ieqn-147"><mml:mspace width="thickmathspace"></mml:mspace><mml:mrow><mml:mo>|</mml:mo><mml:mi>c</mml:mi><mml:mo>|</mml:mo></mml:mrow><mml:mspace width="thickmathspace"></mml:mspace><mml:mo>&#x2264;</mml:mo><mml:mspace width="thickmathspace"></mml:mspace><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mspace width="thickmathspace"></mml:mspace><mml:mstyle scriptlevel="0" displaystyle="true"><mml:mrow><mml:mfrac><mml:mrow><mml:mn>2</mml:mn><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>&#x03B4;</mml:mi></mml:mrow><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:mfrac></mml:mrow><mml:mspace width="thickmathspace"></mml:mspace></mml:mstyle></mml:mrow><mml:mo>)</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula>.</p>
<p><bold>Proof:</bold> We know that the number of root-originating edges is <inline-formula id="ieqn-148">
<alternatives><inline-graphic xlink:href="ieqn-148.png"/><tex-math id="tex-ieqn-148"><![CDATA[$c$]]></tex-math><mml:math id="mml-ieqn-148"><mml:mi>c</mml:mi></mml:math>
</alternatives></inline-formula>. To corrupt a single edge, we need <inline-formula id="ieqn-149">
<alternatives><inline-graphic xlink:href="ieqn-149.png"/><tex-math id="tex-ieqn-149"><![CDATA[$\left\lceil \displaystyle{{\sqrt \delta + 1} \over 2} \right\rceil$]]></tex-math><mml:math id="mml-ieqn-149"><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> number of corruptions. Then to corrupt <inline-formula id="ieqn-150">
<alternatives><inline-graphic xlink:href="ieqn-150.png"/><tex-math id="tex-ieqn-150"><![CDATA[$c$]]></tex-math><mml:math id="mml-ieqn-150"><mml:mi>c</mml:mi></mml:math>
</alternatives></inline-formula> edges, we need <inline-formula id="ieqn-151">
<alternatives><inline-graphic xlink:href="ieqn-151.png"/><tex-math id="tex-ieqn-151"><![CDATA[$c\; \left( \left\lceil \displaystyle{{\sqrt \delta + 1} \over 2} \right\rceil \right)$]]></tex-math><mml:math id="mml-ieqn-151"><mml:mi>c</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow><mml:mo>)</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> number of corruptions. Thus, to corrupt all root-originating edges, we need a minimum of <inline-formula id="ieqn-152">
<alternatives><inline-graphic xlink:href="ieqn-152.png"/><tex-math id="tex-ieqn-152"><![CDATA[$c\; \left( \left\lceil \displaystyle{{\sqrt \delta + 1} \over 2} \right\rceil \right)$]]></tex-math><mml:math id="mml-ieqn-152"><mml:mi>c</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow><mml:mo>)</mml:mo></mml:mrow></mml:math>
</alternatives></inline-formula> corruptions.</p>
<p>But total corruptions cannot exceed <inline-formula id="ieqn-153">
<alternatives><inline-graphic xlink:href="ieqn-153.png"/><tex-math id="tex-ieqn-153"><![CDATA[$\delta$]]></tex-math><mml:math id="mml-ieqn-153"><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></inline-formula>, therefore,</p>
<p><disp-formula id="eqn-3">
<alternatives>
<graphic mimetype="image" mime-subtype="png" xlink:href="eqn-3.png"/><tex-math id="tex-eqn-3"><![CDATA[$$c\; \left( \left\lceil \displaystyle{{\sqrt \delta + 1} \over 2} \right\rceil \right) \; \le \; \; \delta$$]]></tex-math><mml:math id="mml-eqn-3" display="block"><mml:mi>c</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mo>&#x2308;</mml:mo><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mstyle><mml:mo>&#x2309;</mml:mo></mml:mrow><mml:mo>)</mml:mo></mml:mrow><mml:mspace width="thickmathspace"></mml:mspace><mml:mo>&#x2264;</mml:mo><mml:mspace width="thickmathspace"></mml:mspace><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>&#x03B4;</mml:mi></mml:math>
</alternatives></disp-formula></p>
<p><disp-formula id="eqn-4">
<alternatives>
<graphic mimetype="image" mime-subtype="png" xlink:href="eqn-4.png"/><tex-math id="tex-eqn-4"><![CDATA[$$c\; \le \; \left( \left\lfloor {\displaystyle{{2\; \delta } \over {\sqrt \delta + 1\; }}} \right\rfloor \right)$$]]></tex-math><mml:math id="mml-eqn-4" display="block"><mml:mi>c</mml:mi><mml:mspace width="thickmathspace"></mml:mspace><mml:mo>&#x2264;</mml:mo><mml:mspace width="thickmathspace"></mml:mspace><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:mo>&#x230A;</mml:mo><mml:mrow><mml:mstyle displaystyle="true" scriptlevel="0"><mml:mrow><mml:mfrac><mml:mrow><mml:mn>2</mml:mn><mml:mspace width="thickmathspace"></mml:mspace><mml:mi>&#x03B4;</mml:mi></mml:mrow><mml:mrow><mml:msqrt><mml:mi>&#x03B4;</mml:mi></mml:msqrt><mml:mo>&#x002B;</mml:mo><mml:mn>1</mml:mn><mml:mspace width="thickmathspace"></mml:mspace></mml:mrow></mml:mfrac></mml:mrow></mml:mstyle></mml:mrow><mml:mo>&#x230B;</mml:mo></mml:mrow><mml:mo>)</mml:mo></mml:mrow></mml:math>
</alternatives></disp-formula></p>
</sec>
</sec>
<sec id="s5">
<label>5</label>
<title>Conclusion</title>
<p>In this work, we designed a Fault Tolerant Suffix Tree (FTST) data structure which is used for applying substring queries. FTST is very useful specially in situations where memory faults can occur frequently, such as large-scale data processing systems which require low price high capacity memory or systems used at high altitudes and are susceptible to cosmic radiation. We used the natural concept of data replication for the construction of FTST. We also proposed resilient algorithm for sub-string query in FTST and derived an upper bound on the number of maximum corruptions that FTST can sustain.</p>
<p>The proposed FTST construction and sub-string query algorithms can be used in a variety of applications where fault tolerance is a key design requirement. The proposed technique can also be used to design other fault tolerant data structures such as AVL trees, Red-Black trees and Splay trees etc.</p>
</sec>
</body>
<back><fn-group>
<fn fn-type="other">
<p><bold>Funding Statement:</bold> The authors received no specific funding for this study.</p>
</fn>
<fn fn-type="conflict">
<p><bold>Conflicts of Interest:</bold> The authors declare that they have no conflicts of interest to report regarding the present study.</p>
</fn>
</fn-group>
<ref-list content-type="authoryear">
<title>References</title>
<ref id="ref-1">
<label>1</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><string-name><given-names>V.</given-names> <surname>Sridharan</surname></string-name>, <string-name><given-names>N.</given-names> <surname>DeBardeleben</surname></string-name>, <string-name><given-names>S.</given-names> <surname>Blanchard</surname></string-name>, <string-name><given-names>K. B.</given-names> <surname>Ferreira</surname></string-name>, <string-name><given-names>J.</given-names> <surname>Stearley</surname></string-name> <etal>et al.</etal></person-group><italic>,</italic> &#x201C;<article-title>Memory errors in modern systems: the good, the bad, and the ugly</article-title>,&#x201D; <source>ACM SIGPLAN Notices</source>, vol. <volume>50</volume>, no. <issue>4</issue>, pp. <fpage>297</fpage>&#x2013;<lpage>310</lpage>, <year>2015</year>.</mixed-citation></ref><ref id="ref-2"><label>2</label><mixed-citation publication-type="conf-proc"><person-group person-group-type="author"><string-name><given-names>U.</given-names> <surname>Ferraro-Petrillo</surname></string-name>, <string-name><given-names>I.</given-names> <surname>Finocchi</surname></string-name> and <string-name><given-names>G. F.</given-names> <surname>Italiano</surname></string-name></person-group>, &#x201C;<article-title>Experimental study of resilient algorithms and data structures</article-title>,&#x201D; in <conf-name>Proc. Int. Sym. on Experimental Algorithms</conf-name>, <publisher-loc>Berlin, Heidelberg</publisher-loc>: <publisher-name>Springer</publisher-name>, pp. <fpage>1</fpage>&#x2013;<lpage>12</lpage>, <year>2010</year>. </mixed-citation></ref><ref id="ref-3"><label>3</label><mixed-citation publication-type="conf-proc"><person-group person-group-type="author"><string-name><given-names>I.</given-names> <surname>Finocchi</surname></string-name> and <string-name><given-names>G. F.</given-names> <surname>Italiano</surname></string-name></person-group>, &#x201C;<article-title>Sorting and searching in the presence of memory faults (without redundancy)</article-title>,&#x201D; in <conf-name>Proc. 36th ACM Sym. on Theory of Computing</conf-name>, New York, NY, USA, pp. <fpage>101</fpage>&#x2013;<lpage>110</lpage>, <year>2004</year>. </mixed-citation></ref><ref id="ref-4"><label>4</label><mixed-citation publication-type="conf-proc"><person-group person-group-type="author"><string-name><given-names>A.</given-names> <surname>Dhagat</surname></string-name>, <string-name><given-names>P.</given-names> <surname>G&#x00E1;cs</surname></string-name> and <string-name><given-names>P.</given-names> <surname>Winkler</surname></string-name></person-group>, &#x201C;<article-title>On playing twenty questions with a liar</article-title>,&#x201D; in <conf-name>Proc. 3rd ACM-SIAM Sym. on Discrete Algorithms. Society for Industrial and Applied Mathematics</conf-name>, <publisher-loc>USA</publisher-loc>, pp. <fpage>16</fpage>&#x2013;<lpage>22</lpage>, <year>1992</year>. </mixed-citation></ref><ref id="ref-5"><label>5</label><mixed-citation publication-type="conf-proc"><person-group person-group-type="author"><string-name><given-names>L.</given-names> <surname>Zhang</surname></string-name> and <string-name><given-names>S.</given-names> <surname>Swanson</surname></string-name></person-group>, &#x201C;<article-title>Pangolin: a fault-tolerant persistent memory programming library</article-title>,&#x201D; in <conf-name>Proc. 2019 USENIX Annual Technical Conference</conf-name>, Berkeley, CA, USA, pp. <fpage>897</fpage>&#x2013;<lpage>912</lpage>, <year>2019</year>. </mixed-citation></ref><ref id="ref-6"><label>6</label><mixed-citation publication-type="conf-proc"><person-group person-group-type="author"><string-name><given-names>J.</given-names> <surname>Xu</surname></string-name>, <string-name><given-names>L.</given-names> <surname>Zhang</surname></string-name>, <string-name><given-names>A.</given-names> <surname>Memaripour</surname></string-name>, <string-name><given-names>A.</given-names> <surname>Gangadharaiah</surname></string-name>, <string-name><given-names>A.</given-names> <surname>Borase</surname></string-name> <etal>et al.</etal></person-group><italic>,</italic> &#x201C;<article-title>NOVA-Fortis: a fault-tolerant non-volatile main memory file system</article-title>,&#x201D; in <conf-name>Proc. 26th Sym. on Operating Systems Principles</conf-name>, New York, NY, USA, pp. <fpage>478</fpage>&#x2013;<lpage>496</lpage>, <year>2017</year>. </mixed-citation></ref><ref id="ref-7"><label>7</label><mixed-citation publication-type="conf-proc"><person-group person-group-type="author"><string-name><given-names>Y.</given-names> <surname>Xie</surname></string-name>, <string-name><given-names>C.</given-names> <surname>Yang</surname></string-name>, <string-name><given-names>C. A.</given-names> <surname>Mao</surname></string-name>, <string-name><given-names>H.</given-names> <surname>Chen</surname></string-name> and <string-name><given-names>Y. Z.</given-names> <surname>Xie</surname></string-name></person-group>, &#x201C;<article-title>A novel low-overhead fault tolerant parallel-pipelined FFT design</article-title>,&#x201D; in <conf-name>Proc. 2017 IEEE Int. Sym. on Defect and Fault Tolerance in VLSI and Nanotechnology Systems</conf-name>, Cambridge, UK, pp. <fpage>1</fpage>&#x2013;<lpage>4</lpage>, <year>2017</year>. </mixed-citation></ref><ref id="ref-8"><label>8</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><string-name><given-names>I.</given-names> <surname>Finocchi</surname></string-name> and <string-name><given-names>G. F.</given-names> <surname>Italiano</surname></string-name></person-group>, &#x201C;<article-title>Sorting and searching in faulty memories</article-title>,&#x201D; <source>Algorithmica</source>, vol. <volume>52</volume>, no. <issue>3</issue>, pp. <fpage>309</fpage>&#x2013;<lpage>332</lpage>, <year>2008</year>.</mixed-citation></ref><ref id="ref-9"><label>9</label><mixed-citation publication-type="conf-proc"><person-group person-group-type="author"><string-name><given-names>Y.</given-names> <surname>Aumann</surname></string-name> and <string-name><given-names>M. A.</given-names> <surname>Bender</surname></string-name></person-group>, &#x201C;<article-title>Fault-tolerant data structures</article-title>,&#x201D; in <conf-name>Proc. 37th IEEE Sym. on Foundations of Computer Science</conf-name>, Burlington, VT, USA, pp. <fpage>580</fpage>&#x2013;<lpage>589</lpage>, <year>1996</year>. </mixed-citation></ref><ref id="ref-10"><label>10</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><string-name><given-names>I.</given-names> <surname>Finocchi</surname></string-name>, <string-name><given-names>F.</given-names> <surname>Grandoni</surname></string-name> and <string-name><given-names>G. F.</given-names> <surname>Italiano</surname></string-name></person-group>, &#x201C;<article-title>Resilient search trees</article-title>,&#x201D; in <source>Proc. of the 8th Annual ACM-SIAM Sym. on Discrete Algorithms</source>, vol. <volume>7</volume>, no. <issue>9</issue>, pp. <fpage>547</fpage>&#x2013;<lpage>553</lpage>, <year>2007</year>.</mixed-citation></ref><ref id="ref-11"><label>11</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><string-name><given-names>K.</given-names> <surname>Wang</surname></string-name>, <string-name><given-names>Y.</given-names> <surname>Shao</surname></string-name>, <string-name><given-names>L.</given-names> <surname>Shu</surname></string-name>, <string-name><given-names>C.</given-names> <surname>Zhu</surname></string-name> and <string-name><given-names>Y.</given-names> <surname>Zhang</surname></string-name></person-group>, &#x201C;<article-title>Mobile big data fault-tolerant processing for ehealth networks</article-title>,&#x201D; <source>IEEE Network</source>, vol. <volume>30</volume>, no. <issue>1</issue>, pp. <fpage>36</fpage>&#x2013;<lpage>42</lpage>, <year>2016</year>.</mixed-citation></ref><ref id="ref-12"><label>12</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><string-name><given-names>Z.</given-names> <surname>Jia</surname></string-name>, <string-name><given-names>Z.</given-names> <surname>Hou</surname></string-name> and <string-name><given-names>C.</given-names> <surname>Shen</surname></string-name></person-group>, &#x201C;<article-title>Fault-tolerant technology for big data cluster in distributed flow processing system</article-title>,&#x201D; <source>Web Intelligence</source>, vol. <volume>18</volume>, no. <issue>2</issue>, pp. <fpage>101</fpage>&#x2013;<lpage>110</lpage>, <year>2020</year>.</mixed-citation></ref><ref id="ref-13"><label>13</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><string-name><given-names>J.</given-names> <surname>Weidendorfer</surname></string-name>, <string-name><given-names>D.</given-names> <surname>Yang</surname></string-name> and <string-name><given-names>C.</given-names> <surname>Trinitis</surname></string-name></person-group>, &#x201C;<article-title>Laik: a library for fault tolerant distribution of global data for parallel applications</article-title>,&#x201D; <source>PARS-Mitteilungen</source>, vol. <volume>34</volume>, no. <issue>1</issue>, pp. <fpage>140</fpage>&#x2013;<lpage>150</lpage>, <year>2017</year>.</mixed-citation></ref><ref id="ref-14"><label>14</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><string-name><given-names>Z.</given-names> <surname>Wang</surname></string-name>, <string-name><given-names>Y.</given-names> <surname>Gu</surname></string-name>, <string-name><given-names>Y.</given-names> <surname>Bao</surname></string-name>, <string-name><given-names>G.</given-names> <surname>Yu</surname></string-name> and <string-name><given-names>L.</given-names> <surname>Gao</surname></string-name></person-group>, &#x201C;<article-title>An I/O-efficient and adaptive fault-tolerant framework for distributed graph computations</article-title>,&#x201D; <source>Distributed and Parallel Databases</source>, vol. <volume>35</volume>, no. <issue>2</issue>, pp. <fpage>177</fpage>&#x2013;<lpage>196</lpage>, <year>2017</year>.</mixed-citation></ref><ref id="ref-15"><label>15</label><mixed-citation publication-type="journal"><person-group person-group-type="author"><string-name><given-names>C.</given-names> <surname>Lu</surname></string-name> and <string-name><given-names>D.</given-names> <surname>Hu</surname></string-name></person-group>, &#x201C;<article-title>A fault-tolerant routing algorithm for wireless sensor networks based on the structured directional de Bruijn graph</article-title>,&#x201D; <source>Cybernetics and Information Technologies</source>, vol. <volume>16</volume>, no. <issue>2</issue>, pp. <fpage>46</fpage>&#x2013;<lpage>59</lpage>, <year>2016</year>.</mixed-citation></ref></ref-list>
</back>
</article>