<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE article  PUBLIC "-//NLM//DTD Journal Publishing DTD v3.0 20080202//EN" "http://dtd.nlm.nih.gov/publishing/3.0/journalpublishing3.dtd"><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="3.0" xml:lang="en" article-type="research article"><front><journal-meta><journal-id journal-id-type="publisher-id">JCC</journal-id><journal-title-group><journal-title>Journal of Computer and Communications</journal-title></journal-title-group><issn pub-type="epub">2327-5219</issn><publisher><publisher-name>Scientific Research Publishing</publisher-name></publisher></journal-meta><article-meta><article-id pub-id-type="doi">10.4236/jcc.2016.413001</article-id><article-id pub-id-type="publisher-id">JCC-71263</article-id><article-categories><subj-group subj-group-type="heading"><subject>Articles</subject></subj-group><subj-group subj-group-type="Discipline-v2"><subject>Computer Science&amp;Communications</subject></subj-group></article-categories><title-group><article-title>
 
 
  Parallel Quick Search Algorithm for the Exact String Matching Problem Using OpenMP
 
</article-title></title-group><contrib-group><contrib contrib-type="author" xlink:type="simple"><name name-style="western"><surname>Sinan</surname><given-names>Sameer Mahmood Al-Dabbagh</given-names></name><xref ref-type="aff" rid="aff1"><sup>1</sup></xref></contrib><contrib contrib-type="author" xlink:type="simple"><name name-style="western"><surname>Nawaf</surname><given-names>Hazim Barnouti</given-names></name><xref ref-type="aff" rid="aff1"><sup>1</sup></xref></contrib><contrib contrib-type="author" xlink:type="simple"><name name-style="western"><surname>Mustafa</surname><given-names>Abdul Sahib Naser</given-names></name><xref ref-type="aff" rid="aff1"><sup>1</sup></xref></contrib><contrib contrib-type="author" xlink:type="simple"><name name-style="western"><surname>Zaid</surname><given-names>G. Ali</given-names></name><xref ref-type="aff" rid="aff1"><sup>1</sup></xref></contrib></contrib-group><aff id="aff1"><addr-line>Software Engineering and Information Technology Department, Al-Mansour University College, Baghdad, Iraq</addr-line></aff><pub-date pub-type="epub"><day>18</day><month>10</month><year>2016</year></pub-date><volume>04</volume><issue>13</issue><fpage>1</fpage><lpage>11</lpage><history><date date-type="received"><day>August</day>	<month>15,</month>	<year>2016</year></date><date date-type="rev-recd"><day>Accepted:</day>	<month>October</month>	<year>15,</year>	</date><date date-type="accepted"><day>October</day>	<month>18,</month>	<year>2016</year></date></history><permissions><copyright-statement>&#169; Copyright  2014 by authors and Scientific Research Publishing Inc. </copyright-statement><copyright-year>2014</copyright-year><license><license-p>This work is licensed under the Creative Commons Attribution International License (CC BY). http://creativecommons.org/licenses/by/4.0/</license-p></license></permissions><abstract><p>
 
 
  String matching is seen as one of the essential problems in computer science. A variety of computer applications provide the string matching service for their end users. The remarkable boost in the number of data that is created and kept by modern computational devices influences researchers to obtain even more powerful methods for coping with this problem. In this research, the Quick Search string matching algorithm are adopted to be implemented under the multi-core environment using OpenMP directive which can be employed to reduce the overall execution time of the program. English text, Proteins and DNA data types are utilized to examine the effect of parallelization and implementation of Quick Search string matching algorithm on multi-core based environment. Experimental outcomes reveal that the overall performance of the mentioned string matching algorithm has been improved, and the improvement in the execution time which has been obtained is considerable enough to recommend the multi-core environment as the suitable platform for parallelizing the Quick Search string matching algorithm.
 
</p></abstract><kwd-group><kwd>String Matching</kwd><kwd> Pattern Matching</kwd><kwd> String Searching</kwd><kwd> Algorithms</kwd><kwd> Quick Search  Algorithm</kwd><kwd> Exact String Matching Algorithm</kwd><kwd>? Parallelization</kwd><kwd> OpenMP</kwd></kwd-group></article-meta></front><body><sec id="s1"><title>1. Introduction</title><p>String matching algorithms are an important class of string algorithms that try to find a place where one or several strings (also called patterns) are found within a larger string or text. The fundamental string matching problem is defined as follows: given two strings a text and a pattern, determine whether the pattern appears in the text [<xref ref-type="bibr" rid="scirp.71263-ref1">1</xref>] . String matching algorithms are applied in many computer applications, such as data processing, image and voice recognition, ‎information retrieval, computational biology and chemistry [<xref ref-type="bibr" rid="scirp.71263-ref2">2</xref>] . Furthermore, string matching algorithms have become a significant component of applications which are used to search nucleotide or amino acid sequence patterns in biological sequence databases in recent years [<xref ref-type="bibr" rid="scirp.71263-ref3">3</xref>] . Therefore, the performance of the string matching algorithms plays a prominent role in the performance of these computer applications [<xref ref-type="bibr" rid="scirp.71263-ref4">4</xref>] . This research concentrates on the problems which are related to the performance of the Quick Search string matching algorithm. Therefore, the main question is “How to reduce execution time of the Quick Search string matching algorithm by using OpenMP parallel method?” Therefore, the sub question of the main question is “How to prove the performance improvement of the parallel version of the Quick Search string matching algorithm compared with its performance of the sequential version of the Quick Search string matching algorithm?” Therefore, the objective of this paper is to investigate the suitability of parallelizing the Quick Search algorithm on multi-core environment using OpenMP.</p></sec><sec id="s2"><title>2. Related Work</title><sec id="s2_1"><title>2.1. Parallel Processing</title><p>Parallel Processing is defined as the efforts of multiple concurrent processing units that works together to resolve computational problems [<xref ref-type="bibr" rid="scirp.71263-ref5">5</xref>] . The fundamental idea of the parallel programing is to divide the task into sub-task which can be solved simultaneously on ‎multiple Central Processing Units (CPU’s), each sub-task of the program is sub ‎divided into several ‎of instructions and just one ‎program of instructions to be carried out at any particular ‎moment ‎in time [<xref ref-type="bibr" rid="scirp.71263-ref6">6</xref>] .</p></sec><sec id="s2_2"><title>2.2. Parallel String Matching Algorithms</title><p>Parallel computation holds outstanding potential of ‎enhancing the processing and execution ‎times of data in ‎comparison with sequential computation which probably ‎takes a lot of valuable time ‎to show results. At first, generally there ‎are many numerous parallel string ‎matching ‎algorithms which have been produced every single one with the ‎intention of accelerating the overall performance of ‎the algorithms ‎and preserving time via the application of multi-‎processors. OpenMP directives is used to parallelize the string matching algorithms in a multi-core CPU environment which has broad attraction several realms of computer science; one example of these fields is the security applications, in [<xref ref-type="bibr" rid="scirp.71263-ref7">7</xref>] the potential for improving the speed of Intrusion Detection System (IDS) is mentioned, which is a system use to detect the hacker that try to hack the network and report this act of sabotage to the network administrator. The OpenMP directives and Pthread API which are Parallelization methods are used to speed up the Quick Search algorithm and to test the proposed method, which was dependent on analyzing several factors―such as length of pattern and size of dataset―to select the number of threads for parallel execution.</p><p>Parallel string matching algorithms have also an astonishing position in biological applications. Therefore, in [<xref ref-type="bibr" rid="scirp.71263-ref8">8</xref>] the author introduces a hybrid OpenMP/MPI parallel model by utilizing the benefits of shared and distributed memory technologies to the parallel three types of string matching algorithms. As a result, they were very capable of obtain optimum results with specific different types of biological databases in their proposed model. Additionally, in [<xref ref-type="bibr" rid="scirp.71263-ref9">9</xref>] the same author presents a different research indicated that the technique of data partitioning as well as the type of data are extremely essential factors that control the parallelization efficiency.</p></sec></sec><sec id="s3"><title>3. The Proposed Method</title><p>This section includes detailed explanations around ‎the important features along with the behavior examination of ‎Quick Search algorithm. The key reason of examining the ‎behavior of the sequential Quick Search algorithm which ‎involve the preprocessing phase as well as searching ‎phase is to find out the compute-intensive portions of ‎the code, that could be parallelize using OpenMP.</p><sec id="s3_1"><title>3.1. Sequential Quick Search Algorithm</title><p>Quick Search algorithm is a simplified version of Boyer Moore algorithm solves the string matching problem. In general, the Quick Search algorithm composes from two logical phases, pre-‎processing and searching phase [<xref ref-type="bibr" rid="scirp.71263-ref10">10</xref>] . The preprocessing ‎and searching phases of the Quick Search algorithm, are ‎summarized in the next subsections, as shown in <xref ref-type="fig" rid="fig1">Figure 1</xref>.</p><sec id="s3_1_1"><title>3.1.1. Pre-Processing Phase</title><p>The main idea behind the preprocessing phase of the Quick Search algorithm is to collect information about the pattern which known in advance, and use this information during the searching phase. The pattern needs to be skipped a specific amount of characters ‎whenever a match or a mismatch is taking place during ‎the searching process. The Quick Search algorithm use a particular structure ‎known as a bad character table (qsBc) carries the ‎shift information.</p><p>Starting with the rightmost character of the pattern, each character placement (i) ‎subtracts from the value of pattern length (m) and ‎stores in the (qsBc) table. In case there is duplicating the ‎same character several times in the pattern the ﬁrst rightmost occurrence for every character that takes place in the pattern is stored in (qsBc). According to the equation providing below, the (qsBc) ‎table stores the minimum value of the differences ‎between pattern length m and the rightmost ‎locations of each repeated character in that pattern.‎</p><disp-formula id="scirp.71263-formula1"><graphic  xlink:href="http://html.scirp.org/file/1-1730449x2.png"  xlink:type="simple"/></disp-formula></sec><sec id="s3_1_2"><title>3.1.2. Searching Phase</title><p>In this phase, the Quick Search ‎algorithm beginning the matching process from the leftmost character of the pattern with its corresponding character in the text window. If a match or mismatch occur the pattern shift to the right side depending on the value stored in (qsBc) table of the character positioned after the rightmost character of the text window, if the character that immediately follow the rightmost character in the text</p><fig id="fig1"  position="float"><label><xref ref-type="fig" rid="fig1">Figure 1</xref></label><caption><title> Quick search algorithm overview flowchart</title></caption><graphic mimetype="image"   position="float"  xlink:type="simple"  xlink:href="http://html.scirp.org/file/1-1730449x3.png"/></fig><p>window is takes place in the pattern, the pattern shifts to align its own character with the character that located immediately after the rightmost character of the text window. ‎However, in the case the character that positioned after the text window is not occurred in the pattern, the whole pattern shifts to the right side of the character that follow the rightmost character of the text window, and start a new matching process.</p></sec></sec><sec id="s3_2"><title>3.2. Parallel Quick Search Algorithm Evaluation</title><p>This section discusses the main objective of this study, which is the parallelization method of Quick Search algorithm. The Quick Search algorithm is implemented on a multi-core environment platform. The OpenMP library programming interface is used to implement the code.</p><p>According to the analysis of the sequential Quick search algorithm in previous section, the most expensive section of a string matching algorithm is to examine if the character of the pattern matches the character of the text window [<xref ref-type="bibr" rid="scirp.71263-ref11">11</xref>] . To avoid this cost the searching phase which contains the matching process between the characters of the pattern and the text window will parallelize using OpenMP directive.</p><p>The searching phase in the Quick Search string matching algorithm is carried out using multi-core environments platform, as well as the OpenMP which is the programming environments. The OpenMP platform executed the program by divided the entire input data into subdivided parts through fork and join operations, the master thread distributed the works to the worker threads. The parallel Quick Search algorithm start execution the program in sequential fashion conducted by the master thread until the algorithm reach the searching phase function, at this moment slave threads generated for searching phase function, the number of threads is seven because our experiment was conducted using laptop with Core™ with 7 cores and 8 GB RAM The operating system used is Microsoft Windows 8.1. The slave threads executing the searching phase functions and return the partial result to the master thread, the master thread will assemble all the result with the help of join operation and show the output, this operation performed in sequential fashion, the slave threads will terminate itself automatically after send the results to the master thread as shown in <xref ref-type="fig" rid="fig2">Figure 2</xref>.</p><fig id="fig2"  position="float"><label><xref ref-type="fig" rid="fig2">Figure 2</xref></label><caption><title> The proposed searching phase of the quick search algorithm</title></caption><graphic mimetype="image"   position="float"  xlink:type="simple"  xlink:href="http://html.scirp.org/file/1-1730449x4.png"/></fig></sec></sec><sec id="s4"><title>4. Experimental Results and Discussion</title><p>The main idea behind parallelization the Quick Search algorithm is to enhance its performance, to measure the improvement in the performance of parallel Quick Search algorithm over its sequential version there is the execution ‎time factor to evaluate the performance gain. In order to examine the performance of parallel algorithm, a standard benchmark data is used which is represented the common used of string matching algorithm, which are English text, Proteins sequence and DNA sequence. These different data types that have been downloaded from (http://pizzachili.dcc.uchile.cl/texts.html) are differences in the size of alphabets, as a way to ‎analyze the algorithm behaviors with ‎various ‎alphabet sizes.‎ The sequential and parallel program of Quick search algorithm was run with data size 200 MB. Moreover, various pattern lengths were used to assess the behaviors of the ‎algorithm. These lengths are: 10, 20, 30, 40, 50, 60, 70, 80, 90 and 100 characters that are ‎chosen randomly from words inside the text, the sequential and parallel program executed 5 times and the average time for all the attempts is selected [<xref ref-type="bibr" rid="scirp.71263-ref12">12</xref>] .</p><sec id="s4_1"><title>4.1. Parallel Performance Evaluation</title><sec id="s4_1_1"><title>4.1.1. English Text Data Type</title><p>The execution time of the sequential and parallel Quick Search algorithm using English text data type which compose of more than 100 different alphabet types is shown in <xref ref-type="table" rid="table1">Table 1</xref> and <xref ref-type="table" rid="table2">Table 2</xref> respectively.</p><p><xref ref-type="fig" rid="fig3">Figure 3</xref> shows the execution time (average time) of the sequential and parallel of ‎Quick Search algorithm using English text data type. The Quick Search algorithm show unstable behavior when compared to the proteins and DNA data types, this is due to the size of the alphabet used where the English text it consist more than 100 characters, which considered a large alphabet. The unstable behavior appear clearly in the pattern length 40 and 60, which gives the worst time and best time respectively. The execution time of parallel ‎program show better performance compare to the execution time of sequential program.‎</p><table-wrap id="table1" ><label><xref ref-type="table" rid="table1">Table 1</xref></label><caption><title> Sequential performance using English text data type</title></caption><table><tbody><thead><tr><th align="center" valign="middle"  rowspan="2"  >Pattern length</th><th align="center" valign="middle"  colspan="6"  >Sequential quick search algorithm</th></tr></thead><tr><td align="center" valign="middle" >Shot 1</td><td align="center" valign="middle" >Shot 2</td><td align="center" valign="middle" >Shot 3</td><td align="center" valign="middle" >Shot 4</td><td align="center" valign="middle" >Shot 5</td><td align="center" valign="middle" >Average</td></tr><tr><td align="center" valign="middle" >10</td><td align="center" valign="middle" >15.236</td><td align="center" valign="middle" >20.805</td><td align="center" valign="middle" >15.168</td><td align="center" valign="middle" >14.277</td><td align="center" valign="middle" >13.62</td><td align="center" valign="middle" >15.8212</td></tr><tr><td align="center" valign="middle" >20</td><td align="center" valign="middle" >14.559</td><td align="center" valign="middle" >15.752</td><td align="center" valign="middle" >13.245</td><td align="center" valign="middle" >14.366</td><td align="center" valign="middle" >14.346</td><td align="center" valign="middle" >14.4536</td></tr><tr><td align="center" valign="middle" >30</td><td align="center" valign="middle" >21.867</td><td align="center" valign="middle" >18.094</td><td align="center" valign="middle" >12.739</td><td align="center" valign="middle" >12.726</td><td align="center" valign="middle" >12.539</td><td align="center" valign="middle" >15.593</td></tr><tr><td align="center" valign="middle" >40</td><td align="center" valign="middle" >14.297</td><td align="center" valign="middle" >15.017</td><td align="center" valign="middle" >13.658</td><td align="center" valign="middle" >14.879</td><td align="center" valign="middle" >15.449</td><td align="center" valign="middle" >14.66</td></tr><tr><td align="center" valign="middle" >50</td><td align="center" valign="middle" >14.423</td><td align="center" valign="middle" >14.927</td><td align="center" valign="middle" >14.14</td><td align="center" valign="middle" >13.425</td><td align="center" valign="middle" >14.024</td><td align="center" valign="middle" >14.1878</td></tr><tr><td align="center" valign="middle" >60</td><td align="center" valign="middle" >14.811</td><td align="center" valign="middle" >15.481</td><td align="center" valign="middle" >15.031</td><td align="center" valign="middle" >16.772</td><td align="center" valign="middle" >14.312</td><td align="center" valign="middle" >15.2814</td></tr><tr><td align="center" valign="middle" >70</td><td align="center" valign="middle" >15.663</td><td align="center" valign="middle" >14.746</td><td align="center" valign="middle" >15.455</td><td align="center" valign="middle" >15.966</td><td align="center" valign="middle" >14.892</td><td align="center" valign="middle" >15.3444</td></tr><tr><td align="center" valign="middle" >80</td><td align="center" valign="middle" >17.375</td><td align="center" valign="middle" >13.512</td><td align="center" valign="middle" >14.688</td><td align="center" valign="middle" >15.632</td><td align="center" valign="middle" >16.277</td><td align="center" valign="middle" >15.4968</td></tr><tr><td align="center" valign="middle" >90</td><td align="center" valign="middle" >16.637</td><td align="center" valign="middle" >15.446</td><td align="center" valign="middle" >15.307</td><td align="center" valign="middle" >15.129</td><td align="center" valign="middle" >15.603</td><td align="center" valign="middle" >15.6244</td></tr><tr><td align="center" valign="middle" >100</td><td align="center" valign="middle" >14.59</td><td align="center" valign="middle" >13.816</td><td align="center" valign="middle" >20.276</td><td align="center" valign="middle" >13.954</td><td align="center" valign="middle" >16.099</td><td align="center" valign="middle" >15.747</td></tr></tbody></table></table-wrap><table-wrap id="table2" ><label><xref ref-type="table" rid="table2">Table 2</xref></label><caption><title> Parallel performance using English text data type</title></caption><table><tbody><thead><tr><th align="center" valign="middle"  rowspan="2"  >Pattern length</th><th align="center" valign="middle"  colspan="6"  >Parallel quick search algorithm</th></tr></thead><tr><td align="center" valign="middle" >Shot 1</td><td align="center" valign="middle" >Shot 2</td><td align="center" valign="middle" >Shot 3</td><td align="center" valign="middle" >Shot 4</td><td align="center" valign="middle" >Shot 5</td><td align="center" valign="middle" >Average</td></tr><tr><td align="center" valign="middle" >10</td><td align="center" valign="middle" >6.27</td><td align="center" valign="middle" >10.077</td><td align="center" valign="middle" >6.501</td><td align="center" valign="middle" >7.328</td><td align="center" valign="middle" >5.362</td><td align="center" valign="middle" >7.1076</td></tr><tr><td align="center" valign="middle" >20</td><td align="center" valign="middle" >11.043</td><td align="center" valign="middle" >8.527</td><td align="center" valign="middle" >5.293</td><td align="center" valign="middle" >5.612</td><td align="center" valign="middle" >5.673</td><td align="center" valign="middle" >7.2296</td></tr><tr><td align="center" valign="middle" >30</td><td align="center" valign="middle" >8.039</td><td align="center" valign="middle" >8.289</td><td align="center" valign="middle" >8.116</td><td align="center" valign="middle" >7.949</td><td align="center" valign="middle" >8.015</td><td align="center" valign="middle" >8.0816</td></tr><tr><td align="center" valign="middle" >40</td><td align="center" valign="middle" >6.237</td><td align="center" valign="middle" >5.606</td><td align="center" valign="middle" >23.524</td><td align="center" valign="middle" >13.493</td><td align="center" valign="middle" >4.37</td><td align="center" valign="middle" >10.646</td></tr><tr><td align="center" valign="middle" >50</td><td align="center" valign="middle" >8.855</td><td align="center" valign="middle" >7.868</td><td align="center" valign="middle" >7.741</td><td align="center" valign="middle" >7.653</td><td align="center" valign="middle" >7.672</td><td align="center" valign="middle" >7.9578</td></tr><tr><td align="center" valign="middle" >60</td><td align="center" valign="middle" >8.253</td><td align="center" valign="middle" >5.317</td><td align="center" valign="middle" >5.754</td><td align="center" valign="middle" >7.69</td><td align="center" valign="middle" >5.007</td><td align="center" valign="middle" >6.4042</td></tr><tr><td align="center" valign="middle" >70</td><td align="center" valign="middle" >8.973</td><td align="center" valign="middle" >8.681</td><td align="center" valign="middle" >7.625</td><td align="center" valign="middle" >8.555</td><td align="center" valign="middle" >8.636</td><td align="center" valign="middle" >8.494</td></tr><tr><td align="center" valign="middle" >80</td><td align="center" valign="middle" >9.918</td><td align="center" valign="middle" >8.388</td><td align="center" valign="middle" >6.596</td><td align="center" valign="middle" >14.011</td><td align="center" valign="middle" >8.792</td><td align="center" valign="middle" >9.541</td></tr><tr><td align="center" valign="middle" >90</td><td align="center" valign="middle" >13.921</td><td align="center" valign="middle" >9.107</td><td align="center" valign="middle" >8.843</td><td align="center" valign="middle" >9.552</td><td align="center" valign="middle" >6.77</td><td align="center" valign="middle" >9.6386</td></tr><tr><td align="center" valign="middle" >100</td><td align="center" valign="middle" >19.627</td><td align="center" valign="middle" >7.258</td><td align="center" valign="middle" >4.909</td><td align="center" valign="middle" >6.495</td><td align="center" valign="middle" >6.746</td><td align="center" valign="middle" >9.007</td></tr></tbody></table></table-wrap><fig id="fig3"  position="float"><label><xref ref-type="fig" rid="fig3">Figure 3</xref></label><caption><title> Execution time using English text data type</title></caption><graphic mimetype="image"   position="float"  xlink:type="simple"  xlink:href="http://html.scirp.org/file/1-1730449x5.png"/></fig></sec><sec id="s4_1_2"><title>4.1.2. Protein Sequence Data Type</title><p>The execution time of the sequential and parallel Quick Search algorithm using Protein sequence data type which compose of 20 amino acids is shown in <xref ref-type="table" rid="table3">Table 3</xref> and <xref ref-type="table" rid="table4">Table 4</xref> respectively.</p><p><xref ref-type="fig" rid="fig4">Figure 4</xref> show the execution time (average time) of the sequential and parallel of ‎Quick Search algorithm using Proteins sequence data type. The Quick Search algorithm show stable behavior when compared to the English text and DNA data types, this is due to the size of the alphabet used where the Proteins sequence data type it consist with 20 characters, which considered a medium alphabet. The execution time of parallel ‎program show better performance compare to the execution time of sequential program.‎</p><table-wrap id="table3" ><label><xref ref-type="table" rid="table3">Table 3</xref></label><caption><title> Sequential performance using protein sequence data type</title></caption><table><tbody><thead><tr><th align="center" valign="middle"  rowspan="2"  >Pattern length</th><th align="center" valign="middle"  colspan="6"  >Sequential quick search algorithm</th></tr></thead><tr><td align="center" valign="middle" >Shot 1</td><td align="center" valign="middle" >Shot 2</td><td align="center" valign="middle" >Shot 3</td><td align="center" valign="middle" >Shot 4</td><td align="center" valign="middle" >Shot 5</td><td align="center" valign="middle" >Average</td></tr><tr><td align="center" valign="middle" >10</td><td align="center" valign="middle" >‎12.354‎</td><td align="center" valign="middle" >‎12.987‎</td><td align="center" valign="middle" >‎13.115‎</td><td align="center" valign="middle" >‎13.208‎</td><td align="center" valign="middle" >‎12.993‎</td><td align="center" valign="middle" >‎12.9314‎</td></tr><tr><td align="center" valign="middle" >20</td><td align="center" valign="middle" >‎12.453‎</td><td align="center" valign="middle" >‎12.459‎</td><td align="center" valign="middle" >‎12.541‎</td><td align="center" valign="middle" >‎12.47‎</td><td align="center" valign="middle" >‎13.036‎</td><td align="center" valign="middle" >‎12.5918‎</td></tr><tr><td align="center" valign="middle" >30</td><td align="center" valign="middle" >13.499</td><td align="center" valign="middle" >12.302</td><td align="center" valign="middle" >12.374</td><td align="center" valign="middle" >13.099</td><td align="center" valign="middle" >13.206</td><td align="center" valign="middle" >12.896</td></tr><tr><td align="center" valign="middle" >40</td><td align="center" valign="middle" >‎12.259‎</td><td align="center" valign="middle" >‎12.141‎</td><td align="center" valign="middle" >‎12.122‎</td><td align="center" valign="middle" >‎11.971‎</td><td align="center" valign="middle" >‎11.713‎</td><td align="center" valign="middle" >‎12.0412‎</td></tr><tr><td align="center" valign="middle" >50</td><td align="center" valign="middle" >12.378</td><td align="center" valign="middle" >12.37</td><td align="center" valign="middle" >12.026</td><td align="center" valign="middle" >12.099</td><td align="center" valign="middle" >12.39</td><td align="center" valign="middle" >12.2526</td></tr><tr><td align="center" valign="middle" >60</td><td align="center" valign="middle" >‎12.025‎</td><td align="center" valign="middle" >‎12.362‎</td><td align="center" valign="middle" >‎11.886‎</td><td align="center" valign="middle" >‎11.696‎</td><td align="center" valign="middle" >‎11.706‎</td><td align="center" valign="middle" >‎11.935‎</td></tr><tr><td align="center" valign="middle" >70</td><td align="center" valign="middle" >12.451</td><td align="center" valign="middle" >12.23</td><td align="center" valign="middle" >12.045</td><td align="center" valign="middle" >12.051</td><td align="center" valign="middle" >12.048</td><td align="center" valign="middle" >12.165</td></tr><tr><td align="center" valign="middle" >80</td><td align="center" valign="middle" >‎12.491‎</td><td align="center" valign="middle" >‎12.469‎</td><td align="center" valign="middle" >‎11.81‎</td><td align="center" valign="middle" >‎11.554‎</td><td align="center" valign="middle" >‎11.801‎</td><td align="center" valign="middle" >‎12.025‎</td></tr><tr><td align="center" valign="middle" >90</td><td align="center" valign="middle" >12.392</td><td align="center" valign="middle" >12.221</td><td align="center" valign="middle" >12.064</td><td align="center" valign="middle" >12.003</td><td align="center" valign="middle" >12.246</td><td align="center" valign="middle" >12.1852</td></tr><tr><td align="center" valign="middle" >100</td><td align="center" valign="middle" >‎11.546‎</td><td align="center" valign="middle" >‎11.803‎</td><td align="center" valign="middle" >‎11.512‎</td><td align="center" valign="middle" >‎11.509‎</td><td align="center" valign="middle" >‎11.578‎</td><td align="center" valign="middle" >‎11.5896‎</td></tr></tbody></table></table-wrap><table-wrap id="table4" ><label><xref ref-type="table" rid="table4">Table 4</xref></label><caption><title> Parallel performance using protein sequence data type</title></caption><table><tbody><thead><tr><th align="center" valign="middle"  rowspan="2"  >Pattern length</th><th align="center" valign="middle"  colspan="6"  >Parallel quick search algorithm</th></tr></thead><tr><td align="center" valign="middle" >Shot 1</td><td align="center" valign="middle" >Shot 2</td><td align="center" valign="middle" >Shot 3</td><td align="center" valign="middle" >Shot 4</td><td align="center" valign="middle" >Shot 5</td><td align="center" valign="middle" >Average</td></tr><tr><td align="center" valign="middle" >10</td><td align="center" valign="middle" >‎3.899‎</td><td align="center" valign="middle" >‎3.523‎</td><td align="center" valign="middle" >‎3.574‎</td><td align="center" valign="middle" >‎3.473‎</td><td align="center" valign="middle" >‎3.463‎</td><td align="center" valign="middle" >‎3.5864‎</td></tr><tr><td align="center" valign="middle" >20</td><td align="center" valign="middle" >‎3.842‎</td><td align="center" valign="middle" >‎3.474‎</td><td align="center" valign="middle" >‎3.413‎</td><td align="center" valign="middle" >‎3.063‎</td><td align="center" valign="middle" >‎3.069‎</td><td align="center" valign="middle" >‎3.3722‎</td></tr><tr><td align="center" valign="middle" >30</td><td align="center" valign="middle" >3.901</td><td align="center" valign="middle" >4.152</td><td align="center" valign="middle" >3.811</td><td align="center" valign="middle" >6.121</td><td align="center" valign="middle" >4.018</td><td align="center" valign="middle" >4.4006</td></tr><tr><td align="center" valign="middle" >40</td><td align="center" valign="middle" >‎3.531‎</td><td align="center" valign="middle" >‎3.373‎</td><td align="center" valign="middle" >‎3.212‎</td><td align="center" valign="middle" >‎3.147‎</td><td align="center" valign="middle" >‎3.338‎</td><td align="center" valign="middle" >‎3.3202‎</td></tr><tr><td align="center" valign="middle" >50</td><td align="center" valign="middle" >4.321</td><td align="center" valign="middle" >3.607</td><td align="center" valign="middle" >3.261</td><td align="center" valign="middle" >3.673</td><td align="center" valign="middle" >3.754</td><td align="center" valign="middle" >3.7232</td></tr><tr><td align="center" valign="middle" >60</td><td align="center" valign="middle" >‎3.7‎</td><td align="center" valign="middle" >‎3.697‎</td><td align="center" valign="middle" >‎3.425‎</td><td align="center" valign="middle" >‎3.367‎</td><td align="center" valign="middle" >‎3.448‎</td><td align="center" valign="middle" >‎3.5274‎</td></tr><tr><td align="center" valign="middle" >70</td><td align="center" valign="middle" >3.947</td><td align="center" valign="middle" >3.306</td><td align="center" valign="middle" >3.285</td><td align="center" valign="middle" >3.703</td><td align="center" valign="middle" >3.613</td><td align="center" valign="middle" >3.5708</td></tr><tr><td align="center" valign="middle" >80</td><td align="center" valign="middle" >‎3.427‎</td><td align="center" valign="middle" >‎3.288‎</td><td align="center" valign="middle" >‎3.182‎</td><td align="center" valign="middle" >‎3.627‎</td><td align="center" valign="middle" >‎3.158‎</td><td align="center" valign="middle" >‎3.3364‎</td></tr><tr><td align="center" valign="middle" >90</td><td align="center" valign="middle" >3.529</td><td align="center" valign="middle" >3.234</td><td align="center" valign="middle" >3.589</td><td align="center" valign="middle" >3.359</td><td align="center" valign="middle" >3.175</td><td align="center" valign="middle" >3.3772</td></tr><tr><td align="center" valign="middle" >100</td><td align="center" valign="middle" >‎3.283‎</td><td align="center" valign="middle" >‎3.31‎</td><td align="center" valign="middle" >‎3.129‎</td><td align="center" valign="middle" >‎3.159‎</td><td align="center" valign="middle" >‎3.619‎</td><td align="center" valign="middle" >‎3.3‎</td></tr></tbody></table></table-wrap><fig id="fig4"  position="float"><label><xref ref-type="fig" rid="fig4">Figure 4</xref></label><caption><title> Execution time using protein sequence data type</title></caption><graphic mimetype="image"   position="float"  xlink:type="simple"  xlink:href="http://html.scirp.org/file/1-1730449x6.png"/></fig></sec><sec id="s4_1_3"><title>4.1.3. DNA Sequence Data Type</title><p>The execution time of the sequential and parallel Quick Search algorithm using DNA sequence data type which compose of 4 characters that indicate the chemical foundations of the cell nucleus is shown in <xref ref-type="table" rid="table5">Table 5</xref> and <xref ref-type="table" rid="table6">Table 6</xref> respectively.</p><p><xref ref-type="fig" rid="fig5">Figure 5</xref> shows the execution time (average time) of the sequential and parallel of ‎Quick Search algorithm using DNA sequence data type. The Quick Search algorithm show stable behavior when compared to the English text and Proteins sequence data types, this is due to the size of the alphabet used where the DNA sequence data type it consist only 4 characters, which considered a small alphabet. The execution time of parallel ‎program show better performance compare to the execution time of sequential program.‎</p><table-wrap id="table5" ><label><xref ref-type="table" rid="table5">Table 5</xref></label><caption><title> Sequential performance using DNA sequence data type</title></caption><table><tbody><thead><tr><th align="center" valign="middle"  rowspan="2"  >Pattern length</th><th align="center" valign="middle"  colspan="6"  >Sequential quick search algorithm</th></tr></thead><tr><td align="center" valign="middle" >Shot 1</td><td align="center" valign="middle" >Shot 2</td><td align="center" valign="middle" >Shot 3</td><td align="center" valign="middle" >Shot 4</td><td align="center" valign="middle" >Shot 5</td><td align="center" valign="middle" >Average</td></tr><tr><td align="center" valign="middle" >10</td><td align="center" valign="middle" >‎15.541‎</td><td align="center" valign="middle" >‎15.524‎</td><td align="center" valign="middle" >‎15.22‎</td><td align="center" valign="middle" >‎15.696‎</td><td align="center" valign="middle" >‎15.592‎</td><td align="center" valign="middle" >‎15.5146‎</td></tr><tr><td align="center" valign="middle" >20</td><td align="center" valign="middle" >‎14.687‎</td><td align="center" valign="middle" >‎15.426‎</td><td align="center" valign="middle" >‎14.752‎</td><td align="center" valign="middle" >‎14.342‎</td><td align="center" valign="middle" >‎13.736‎</td><td align="center" valign="middle" >‎14.5886‎</td></tr><tr><td align="center" valign="middle" >30</td><td align="center" valign="middle" >13.055</td><td align="center" valign="middle" >13.36</td><td align="center" valign="middle" >16.34</td><td align="center" valign="middle" >13.336</td><td align="center" valign="middle" >13.022</td><td align="center" valign="middle" >13.8226</td></tr><tr><td align="center" valign="middle" >40</td><td align="center" valign="middle" >‎13.997‎</td><td align="center" valign="middle" >‎13.9‎</td><td align="center" valign="middle" >‎13.904‎</td><td align="center" valign="middle" >‎14.132‎</td><td align="center" valign="middle" >‎13.794‎</td><td align="center" valign="middle" >‎13.9454‎</td></tr><tr><td align="center" valign="middle" >50</td><td align="center" valign="middle" >13.791</td><td align="center" valign="middle" >13.479</td><td align="center" valign="middle" >13.277</td><td align="center" valign="middle" >13.173</td><td align="center" valign="middle" >13.667</td><td align="center" valign="middle" >13.4774</td></tr><tr><td align="center" valign="middle" >60</td><td align="center" valign="middle" >‎14.163‎</td><td align="center" valign="middle" >‎13.872‎</td><td align="center" valign="middle" >‎13.735‎</td><td align="center" valign="middle" >‎13.602‎</td><td align="center" valign="middle" >‎13.909‎</td><td align="center" valign="middle" >‎13.8562‎</td></tr><tr><td align="center" valign="middle" >70</td><td align="center" valign="middle" >13.671</td><td align="center" valign="middle" >13.814</td><td align="center" valign="middle" >13.311</td><td align="center" valign="middle" >13.14</td><td align="center" valign="middle" >13.492</td><td align="center" valign="middle" >13.4856</td></tr><tr><td align="center" valign="middle" >80</td><td align="center" valign="middle" >‎13.533‎</td><td align="center" valign="middle" >‎13.639‎</td><td align="center" valign="middle" >‎13.341‎</td><td align="center" valign="middle" >‎13.427‎</td><td align="center" valign="middle" >‎13.73‎</td><td align="center" valign="middle" >‎13.534‎</td></tr><tr><td align="center" valign="middle" >90</td><td align="center" valign="middle" >13.947</td><td align="center" valign="middle" >13.702</td><td align="center" valign="middle" >13.639</td><td align="center" valign="middle" >13.662</td><td align="center" valign="middle" >13.844</td><td align="center" valign="middle" >13.7588</td></tr><tr><td align="center" valign="middle" >100</td><td align="center" valign="middle" >‎14.814‎</td><td align="center" valign="middle" >‎14.901‎</td><td align="center" valign="middle" >‎14.695‎</td><td align="center" valign="middle" >‎14.501‎</td><td align="center" valign="middle" >‎14.573‎</td><td align="center" valign="middle" >‎14.6968‎</td></tr></tbody></table></table-wrap><table-wrap id="table6" ><label><xref ref-type="table" rid="table6">Table 6</xref></label><caption><title> Parallel performance using DNA sequence data type</title></caption><table><tbody><thead><tr><th align="center" valign="middle"  rowspan="2"  >Pattern length</th><th align="center" valign="middle"  colspan="6"  >Parallel quick search algorithm</th></tr></thead><tr><td align="center" valign="middle" >Shot 1</td><td align="center" valign="middle" >Shot 2</td><td align="center" valign="middle" >Shot 3</td><td align="center" valign="middle" >Shot 4</td><td align="center" valign="middle" >Shot 5</td><td align="center" valign="middle" >Average</td></tr><tr><td align="center" valign="middle" >10</td><td align="center" valign="middle" >‎5.664‎</td><td align="center" valign="middle" >‎6.667‎</td><td align="center" valign="middle" >‎5.807‎</td><td align="center" valign="middle" >‎5.904‎</td><td align="center" valign="middle" >‎5.632‎</td><td align="center" valign="middle" >‎5.9348‎</td></tr><tr><td align="center" valign="middle" >20</td><td align="center" valign="middle" >‎5.319‎</td><td align="center" valign="middle" >‎5.072‎</td><td align="center" valign="middle" >‎5.392‎</td><td align="center" valign="middle" >‎5.731‎</td><td align="center" valign="middle" >‎5.903‎</td><td align="center" valign="middle" >‎5.4834‎</td></tr><tr><td align="center" valign="middle" >30</td><td align="center" valign="middle" >4.402</td><td align="center" valign="middle" >4.48</td><td align="center" valign="middle" >4.005</td><td align="center" valign="middle" >3.98</td><td align="center" valign="middle" >4.042</td><td align="center" valign="middle" >4.1818</td></tr><tr><td align="center" valign="middle" >40</td><td align="center" valign="middle" >‎5.01‎</td><td align="center" valign="middle" >‎4.896‎</td><td align="center" valign="middle" >‎4.806‎</td><td align="center" valign="middle" >‎5.008‎</td><td align="center" valign="middle" >‎5.046‎</td><td align="center" valign="middle" >‎4.9532‎</td></tr><tr><td align="center" valign="middle" >50</td><td align="center" valign="middle" >4.954</td><td align="center" valign="middle" >4.892</td><td align="center" valign="middle" >4.476</td><td align="center" valign="middle" >4.465</td><td align="center" valign="middle" >4.596</td><td align="center" valign="middle" >4.6766</td></tr><tr><td align="center" valign="middle" >60</td><td align="center" valign="middle" >‎5.462‎</td><td align="center" valign="middle" >‎5.422‎</td><td align="center" valign="middle" >‎5.253‎</td><td align="center" valign="middle" >‎4.862‎</td><td align="center" valign="middle" >‎4.86‎</td><td align="center" valign="middle" >‎5.1718‎</td></tr><tr><td align="center" valign="middle" >70</td><td align="center" valign="middle" >4.923</td><td align="center" valign="middle" >4.692</td><td align="center" valign="middle" >4.892</td><td align="center" valign="middle" >4.733</td><td align="center" valign="middle" >4.67</td><td align="center" valign="middle" >4.782</td></tr><tr><td align="center" valign="middle" >80</td><td align="center" valign="middle" >‎4.623‎</td><td align="center" valign="middle" >‎4.933‎</td><td align="center" valign="middle" >‎4.715‎</td><td align="center" valign="middle" >‎4.615‎</td><td align="center" valign="middle" >‎4.72‎</td><td align="center" valign="middle" >‎4.7212‎</td></tr><tr><td align="center" valign="middle" >90</td><td align="center" valign="middle" >5.41</td><td align="center" valign="middle" >5.178</td><td align="center" valign="middle" >5.122</td><td align="center" valign="middle" >5.153</td><td align="center" valign="middle" >5.198</td><td align="center" valign="middle" >5.2122</td></tr><tr><td align="center" valign="middle" >100</td><td align="center" valign="middle" >‎6.088‎</td><td align="center" valign="middle" >‎6.319‎</td><td align="center" valign="middle" >‎5.984‎</td><td align="center" valign="middle" >‎5.783‎</td><td align="center" valign="middle" >‎6.079‎</td><td align="center" valign="middle" >‎6.0506‎</td></tr></tbody></table></table-wrap><fig id="fig5"  position="float"><label><xref ref-type="fig" rid="fig5">Figure 5</xref></label><caption><title> Execution time using DNA sequence data type</title></caption><graphic mimetype="image"   position="float"  xlink:type="simple"  xlink:href="http://html.scirp.org/file/1-1730449x7.png"/></fig></sec></sec></sec><sec id="s5"><title>5. Conclusion</title><p>This study aims to parallelize the Quick Search exact string matching algorithm. Based on the design presented in Section 3, the parallelization method produced a parallel Quick Search algorithm using OpenMP directive. From the results in Section 4, we can note that when parallelizing the Quick Search algorithm by using OpenMP directive under multi-core environment, the parallel program shows better performance compared to the sequential program in terms of execution time when using different data types with different patterns length. In addition, the experimental results show that when using English text data type the Quick Search algorithm gives unstable results due to the size of the alphabet which is considered a large alphabet, but it gives a stable result when using medium and small alphabet as proteins and DNA data types. As a conclusion, we recommend the ‎multi-core environment as the suitable platform for ‎ parallelizing the Quick Search string matching algorithm. For future work the parallel Quick Search algorithm could be enhanced by parallelizing the preprocessing phase with the searching phase.</p></sec><sec id="s6"><title>Cite this paper</title><p>Al-Dabbagh, S.S.M., Barnouti, N.H., Naser, M.A.S. and Ali, Z.G. (2016) Parallel Quick Search Algorithm for the Exact String Matching Problem Using OpenMP. Journal of Computer and Communications, 4, 1-11. http://dx.doi.org/10.4236/jcc.2016.413001</p></sec></body><back><ref-list><title>References</title><ref id="scirp.71263-ref1"><label>1</label><mixed-citation publication-type="other" xlink:type="simple">Faro, S. and Külekci, O. (2015) Efficient Algorithms for the Order Preserving Pattern Matching Problem. arXiv:1501.04001.</mixed-citation></ref><ref id="scirp.71263-ref2"><label>2</label><mixed-citation publication-type="other" xlink:type="simple">Faro, S. and Lecroq, T. (2013) The Exact Online String Matching Problem: A Review of the Most Recent Results. ACM Computing Surveys (CSUR), 45, 2. 
http://dx.doi.org/10.1145/2431211.2431212</mixed-citation></ref><ref id="scirp.71263-ref3"><label>3</label><mixed-citation publication-type="other" xlink:type="simple">Navarro, G. (2011) A Guided Tour to Approximate String Matching. ACM Computing Surveys (CSUR), 33, 31-88. http://dx.doi.org/10.1145/375360.375365</mixed-citation></ref><ref id="scirp.71263-ref4"><label>4</label><mixed-citation publication-type="other" xlink:type="simple">Raju, S.V., Babu, A.V. and Mrudula, M. (2006) Backend Engine for Parallel String Matching Using Boolean Matrix. International Symposium on Parallel Computing in Electrical Engineering, 13-17 September 2006. http://dx.doi.org/10.1109/PARELEC.2006.20</mixed-citation></ref><ref id="scirp.71263-ref5"><label>5</label><mixed-citation publication-type="other" xlink:type="simple">Zha, X.Y. and Sahni, S. (2013) GPU-to-GPU and Host-to-Host Multipattern String Matching on a GPU. IEEE Transactions on Computers, 62, 1156-1169. 
http://dx.doi.org/10.1109/TC.2012.61</mixed-citation></ref><ref id="scirp.71263-ref6"><label>6</label><mixed-citation publication-type="other" xlink:type="simple">Buyya, R. (2000) The Design of PARAS Microkernel. [Online].  
http://www.cloudbus.org/ raj/microkernel/</mixed-citation></ref><ref id="scirp.71263-ref7"><label>7</label><mixed-citation publication-type="other" xlink:type="simple">Hnaif, A.A., et al. (2008) Parallel Quick Search Algorithm to Speed Packet Payload Filtering in NIDS. Executive Development, 21, 22.</mixed-citation></ref><ref id="scirp.71263-ref8"><label>8</label><mixed-citation publication-type="other" xlink:type="simple">Kouzinopoulos, C.S., Margaritis, K.G. and Michailidis, P.D. (2011) Parallel Processing of Multiple Pattern Matching Algorithms for Biological Sequences: Methods and Performance Results. INTECH Open Access Publisher.</mixed-citation></ref><ref id="scirp.71263-ref9"><label>9</label><mixed-citation publication-type="other" xlink:type="simple">Kouzinopoulos, C. and Margaritis, K. (2009) Parallel Implementation of Exact Two Dimensional Pattern Matching Algorithms Using MPI and OpenMP. 9th Hellenic European Research on Computer Mathematics and Its Applications Conference.</mixed-citation></ref><ref id="scirp.71263-ref10"><label>10</label><mixed-citation publication-type="other" xlink:type="simple">Sunday, D.M. (1990) A Very Fast Substring Search Algorithm. Communications of the ACM, 33, 132-142. http://dx.doi.org/10.1145/79173.79184</mixed-citation></ref><ref id="scirp.71263-ref11"><label>11</label><mixed-citation publication-type="other" xlink:type="simple">Charras, C. and Lecroq, T. (2004) Handbook of Exact String Matching Algorithms. King’s College.</mixed-citation></ref><ref id="scirp.71263-ref12"><label>12</label><mixed-citation publication-type="other" xlink:type="simple">Kadhim, H.A. and Abdul Rashidx, N.A. (2014) Maximum-Shift String Matching Algorithms. International Conference on Computer and Information Sciences (ICCOINS).</mixed-citation></ref></ref-list></back></article>