home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / doc / alphasor / thesis
Text File  |  1994-02-22  |  41KB  |  773 lines

  1.  
  2.  
  3.                         DISCOURSE ON ALPHASORT
  4.  
  5.                          PATENT NO. 5,218,700
  6.  
  7.                            COMPARISON WITH
  8.  
  9.                        OTHER SORTING ALGORITHMS
  10.  
  11.  
  12.  
  13.  
  14.                         Written by Al Beechick
  15.                   Copyright 1994 by Arrow Connection
  16.                              P.O. Box 899
  17.                         Pollock Pines CA 95726
  18.                             (916) 644-2341
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.                           TABLE OF CONTENTS
  28.  
  29.        1.  Alphasort, the Newer and Faster MSD Radix Algorithm
  30.        2.  Comparison to Quicksort
  31.        3.  Comparison to Radix Exchange Sorting
  32.        4.  Comparison to Sorting by Distribution
  33.        5.  Comparison to Sorting by Address Calculation
  34.        6.  Comparison to Patent No. 4,809,158
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47. 1.  ALPHASORT, THE NEWER AND FASTER MSD RADIX ALGORITHM
  48.  
  49.      Computer sorting algorithms can be divided into two classes, 
  50. those that use compares and those that don't.  Radix sorting does not 
  51. use compares, and Alphasort falls into this class.  This paper 
  52. compares Alphasort to other sorting algorithms that fall into both 
  53. classes.  The goal is to help the reader understand why and how 
  54. Alphasort is faster.
  55.      Alphasort is called such, because it sorts by placing words 
  56. according to the letters of the alphabet. This bypasses the need for 
  57. compares.  In addition to letters of the alphabet, Alphasort examines 
  58. numbers or any computer-recognizable character.  This method of 
  59. placing words in "bins" or "piles" according to the characters in the 
  60. word is radix sorting.
  61.      When Alphasort examines the characters, it starts at the most 
  62. significant digit (MSD).  In other words, it starts at the front of 
  63. the word.  This is the opposite of traditional radix sorting which 
  64. starts at the least significant digit (LSD).  Old radix methods 
  65. examined each character of the word, starting at the end of the word.  
  66. The final pass, therefore, would be on the most significant digit, and 
  67. this was necessary because of memory handling problems.
  68.      The memory problems encountered by radix sorting were how to keep 
  69. track of the "bins" or "piles."  According to traditional radix 
  70. thought, starting at the most significant digit would result in a 
  71. multiplicity of "piles," and therefore use up a huge amount of memory 
  72. in the computer.  But Alphasort resolves this problem, finding a way 
  73. to use a minimum amount of memory, no more memory than other methods 
  74. which use compares.
  75.      Resolving the memory problem is the key to faster sorting.  Now 
  76. that Alphasort starts at the most signifcant digit, this means that 
  77. only a fraction of the total digits need to be examined, instead of 
  78. all the digits as before.  For example, if the first two passes result 
  79. in a unique placement of the word, then the rest of the letters in the 
  80. word are not examined.  If "Alfred" is the only name in the list which 
  81. starts with "Al," then the characters "fred" are not examined.  This 
  82. eliminates unnecessary passes, and it results in maximum efficiency.
  83.      Alphasort not only increases efficiency over traditional radix 
  84. sorting, but it also surpasses the other class of sorting methods, 
  85. namely those methods which use compares.  This could not be said of 
  86. traditional radix sorting methods which sort according to the least 
  87. significant digit.  The necessity to examine each and every digit 
  88. resulted in lower efficiency, and so there was no compelling need to 
  89. abandon methods which use compares in favor of a radix method.  But a 
  90. radix method which sorts by the most significant digit examines only a 
  91. fraction of the digits, resulting in an efficiency which surpasses 
  92. that class of methods which use compares.
  93.      Formulas show that sorting time increases, not proportionally, 
  94. but geometrically, for methods which use compares.  In other words, 
  95. to increase a list by one item, the number of compares increases by, 
  96. not one, but a multiple thereof.  If N is the number of items in 
  97. the list being sorted, then a method which uses compares may need 
  98. N x log(base 2) N passes.  In contrast, Alphasort uses approximately 
  99. N x log(base r) N passes, where r is the range of values that 
  100. individual characters can take, such as 26 for alphabetical sorting, 
  101. or 10 for numerical sorting.
  102.      If you were to graph sorting time against the size of the list, 
  103. Alphasort's increased sorting time would rise almost linearly.  The 
  104. reason the graph would not show an exactly straight line is that 
  105. additional items may require Alphasort to examine more digits in some 
  106. items.  It "may" require additional passes because the likelihood 
  107. increases that words "may" have the same first two or three 
  108. characters.  On the other hand, if items added to the list have unique 
  109. opening letters, then additional sorting passes will not be required.  
  110. So sorting time depends upon the makeup of the list more than the size 
  111. of the list.
  112.      In contrast, methods which use compares require additional passes 
  113. as the list size increases.  This is an inherent requirement of the 
  114. algorithm.  Therefore, if you were to graph sorting time against the 
  115. size of the list, increased sorting time would rise with a markedly 
  116. upward curve.
  117.      The preferable method for long lists, therefore, is Alphasort.  
  118. But it works with equal efficiency for short lists.  This is in 
  119. contrast to traditional radix sorting.  Since traditional radix 
  120. sorting starts at the least significant digit, it has to examine each 
  121. digit, and this is wasted effort in a short list.  However, Alphasort 
  122. starts with the most significant digit, meaning that for a short list 
  123. only a small fraction of the total digits need to be examined.  The 
  124. concept of Alphasort is that only the minimum amount of passes need be 
  125. applied to sort the list at hand.  Thus, for a list of only 10 items, 
  126. there is a strong likelihood that the entire list can be sorted in one 
  127. pass.  If by chance, two words in the short list started with the same 
  128. letter, then an additional pass would be taken on those two words.
  129.      The worst case scenario for Alphasort is a large number of 
  130. duplicates or near duplicates in the list being sorted.  This forces 
  131. additional passes in order to arrive at a unique combination of 
  132. opening characters for each item.  Even in this worst case scenario, 
  133. Alphasort compares favorably with traditional radix sorting methods, 
  134. because the traditional methods examined each character regardless of 
  135. whether the items were duplicates not.
  136.      The table in the next section compares sorting times of Alphasort 
  137. and quicksort that I tested on my personal computer.  The list used 
  138. had many duplicates, because I increased list size by copying portions 
  139. of the list.  Therefore, the table reflects Alphasort's performance at 
  140. its worst case scenario.  Even then it compares favorably with 
  141. quicksort.
  142.      To summarize thus far, Alphasort compares favorably with both 
  143. classes of sorting algorithms.  The class of algorithms which use 
  144. compares will always be at a disadvantage next to Alphasort, because 
  145. Alphasort never uses compares.  The necessity of multiplying compares 
  146. hampers efficiency.  Also, Alphasort compares favorably with 
  147. traditional radix methods, because it starts at the most significant 
  148. digit instead of the least significant digit.  The necessity of 
  149. examining each digit hampers efficiency in traditional radix methods.  
  150.      Alphasort achieves this efficiency because of the way it handles 
  151. the "bins" or the "piles."  How Alphasort handles computer memory will 
  152. be examined more closely in the last section where the Alphasort 
  153. patent is compared to prior a patent.
  154.      A question I often receive is, "How does Alphasort handle 
  155. integers?"  My answer, "It handles integers the same way it handles 
  156. words."  The method examines the digits, which can be any alphanumeric 
  157. character.  It does not matter whether the digits are letters, 
  158. numbers, or any other special character in the set of recognizable 
  159. computer characters.
  160.      When sorting integers, however, the programmer will want to make 
  161. one small adjustment.  Make the first pass on the length of the 
  162. integer, and then make the second pass on the first digit of the 
  163. integer.  In other words, when sorting 10, 100, and 1000, the 
  164. respective lengths are 2, 3 and 4.  Thus the first pass places shorter 
  165. integers before longer ones, so that 10 ends up in a different "pile" 
  166. than 100.  The second pass, then, distinguishes 10 from 20, and so on 
  167. up to 99.  You can think of it as sorting on the zero byte first and 
  168. the first byte second.
  169.      Now that you have an overview of Alphasort, let's get into more 
  170. detail as we compare Alphasort to other methods of sorting.
  171.  
  172.  
  173.  
  174. 2.  COMPARISON TO QUICKSORT
  175.  
  176.  
  177. My tests show that Alphasort runs at least twice as fast as quicksort, 
  178. even faster for certain kinds of lists.  The quicksort I used came 
  179. with Borland's Turbo Pascal.  The list I used for testing purposes was 
  180. a list of people's names.  The original list had 175 names.  I created 
  181. longer lists by copying the original list several times.  Therefore, 
  182. the longer lists have many exact duplicates, putting Alphasort at its 
  183. worst case scenario.  I ran these tests on my 38625 personal computer.  
  184.  
  185. The times shown in the following tables start from reading the list 
  186. from the hard drive until the list is sorted in memory.  I displayed 
  187. the sorted list on the screen for verification, but such display was 
  188. not counted in the sorting time.  Assuming that the reading-from-disk 
  189. time was equal for both algorithms, then the actual sorting time for 
  190. Alphasort vs. quicksort would be even more favorable than the 
  191. following tables show.  I did not attempt to separate read time from 
  192. sorting time; my source code combines the read with the first pass.  
  193. In other words, as Alphasort reads one item it also places that item 
  194. in a "bin" or "pile" according to the first letter of that item.  So 
  195. the read and the first placing both occur in the first loop.  It is 
  196. not necessary to combine these, of course, but that is the way I 
  197. happened to do it.
  198.  
  199.  
  200. Table 1.  Comparison of sorting times of a list of names up to 24 
  201. characters wide.  Programs were compiled in Turbo Pascal on a 38625 
  202. personal computer.  Times given are seconds and hundreths of seconds. 
  203.  
  204. length of list:      2000  1800  1600  1400  1200  1000
  205.  
  206. Quicksort            4:94  4:40  4:17  3:46  3:24  2:69
  207. Alphasort            2:41  2:31  2:14  2:04  1:97  1:26
  208.  
  209.  
  210. Table 2.  Comparison of sorting times of a list of names items 10 
  211. characters wide.
  212.  
  213. length of list:      5000  3000  1000
  214.  
  215. Quicksort           12:08  6:93  2:53
  216. Alphasort            3:51  2:86  1:20
  217.  
  218.  
  219. These tables show that the width of the items affect Alphasort more 
  220. than the length of the list.  The width of the items is more of a 
  221. factor when there are more duplicates in the list.  Fewer duplicates 
  222. would mean that the width of the items would not be as much of a 
  223. factor.  This is due to the nature of radix sorting, which examines 
  224. the items one character at a time and puts then into "bins" or "piles" 
  225. according to those characters.
  226.  
  227. I was limited in these tests by the memory limitations of my Turbo 
  228. Pascal compiler, which in turn was limited by the memory limitations 
  229. of DOS.  Alphasort itself, has no inherent memory limitation, and it 
  230. uses a minimal amount of memory.  Its use of memory will be discussed 
  231. in the last section of this paper where it is compared to a prior 
  232. patent.
  233.  
  234. Although these tests show promise, more comprehensive tests and 
  235. benchmarks need to be designed.  Considering that these tests were run 
  236. with a list that put Alphasort at a disadvantage, I expect that future 
  237. tests will not deviate very far from these results, or they might 
  238. produce even more favorable results.
  239.  
  240. To understand why Alphasort runs faster than quicksort, let's look at 
  241. a table of running times.
  242.  
  243.  
  244. Table 3.  Comparison of running times.  The figures for the first two 
  245. algorithms are taken from Donald Knuth's volume Sorting and Searching, 
  246. (p. 381) and the figures for Alphasort are taken from my test.  To 
  247. arrive at Alphasort's running time, I used a counter in the repeat loops.
  248.  
  249. length of list:                   16    1000
  250.  
  251. Distribution counting (radix)   10362  32010
  252. Median-of-3-quicksort             470  81486
  253. Alphasort                          54   7744
  254.  
  255.  
  256. Knuth uses this table to show that radix sorting is not efficient for 
  257. short lists.  As you can see, distribution counting (traditional 
  258. radix) loses to quicksort in the short list, but wins in the long 
  259. list.  However, Alphasort wins for both lists, because it sorts from 
  260. the most significant digit, unlike traditional radix sorting which 
  261. sorts from the least significant digit.
  262.  
  263. Now that we've looked at some numbers, let's discuss the theory behind 
  264. the numbers.  Let's explain why Alphasort runs faster than quicksort.
  265.  
  266. Quicksort uses partitions.  It divides a list in half, compares words 
  267. in each half, and then swaps them if necessary.  It further partitions 
  268. the list and makes further swaps.  As I understand it, each time a word 
  269. is swapped the word moves about half way closer to its destination. 
  270. It's like a football team starting at it's own zero yard line.  On the 
  271. first play they gain 50 yards, half way to the goal line.  On the next 
  272. play they make 25 yards.  On the next play 12 or 13 yards. At that rate 
  273. they should reach the goal in 4 or 5 plays.
  274.  
  275. Assuming 26 letters in the alphabet, each pass of Alphasort gets the 
  276. word 26 times closer to its destination.  It's like a football team 
  277. making 96 yards on its first play.  Alphasort often reaches the goal in 
  278. 2 or 3 passes.
  279.  
  280. How does Alphasort accomplish this?  The first pass examines the first 
  281. letter of each word.  All the As are linked together in memory, all the 
  282. Bs are linked together in memory, and so on.  The words are not moved, 
  283. but memory links their addresses together so that they can be accessed 
  284. for the next pass.  The second pass examines the second letter, not the 
  285. second letter of every word in the list, but the second letter of only 
  286. those words beginning with A.  The third pass likewise examines the 
  287. third letter of the highest group of words on the list.  In most cases 
  288. a unique combination of the first two or three letters allows words to 
  289. be quickly sorted.  In other cases, where the first 10 letters are the 
  290. same, then more passes are needed to sort those words.  Never is any 
  291. letter examined unnecessarily.  Passes are kept to an absolute minimum.
  292.  
  293. We've discussed various scenarios, long lists, short lists, and lists 
  294. with duplicates.  Another scenario is a list that is previously 
  295. sorted.  Based on the previous paragraph, it makes no difference to 
  296. Alphasort whether or not the list was previously sorted.  Quicksort, 
  297. however, would be affected by such a list.
  298.  
  299.  
  300.  
  301. 3.  COMPARISON TO RADIX EXCHANGE SORTING
  302.  
  303.  
  304. Radix exchange sorting, described in Knuth's volume, Sorting and 
  305. Searching, is a combination of quicksort and radix sorting.  The 
  306. sorting process works like quicksort does because the list is divided 
  307. into partitions, and records are swapped from one side of the 
  308. partition to the other.  It differs from quicksort in that individual 
  309. digits are examined instead of comparing entire records.
  310.  
  311. Does this method gain any advantage?  The textbook says "Thus radix 
  312. exchange sorting takes about as long as quicksort, on the average" 
  313. (p. 128).
  314.  
  315. Exchange sorting (whether it be quicksort or radix exchange sorting) 
  316. sets up a partition midway in the list and moves records from one side 
  317. to the other.  Then it sets up other partitions to further divide the 
  318. list, and so on.  Therefore, each record is moved several times, each 
  319. time a little closer to its final destination.  Each time a record is 
  320. moved, it is moved twice as close (on average) to its final 
  321. destination as it was before.  It keeps on moving twice as close as it 
  322. was before until it finally hits the right spot.
  323.  
  324. The same comments can be said here as were said about quicksort above.   
  325. Visualize again a football field.  Imagine a football team starting 
  326. with the ball almost on the 0 yard line.  On their first play they make 
  327. 50 yards.  That's half way to the goal.  On the next play they make 25 
  328. yards.  Again that's half way to the goal.  On the next play they make 
  329. 12 and one-half, then 6 and one-fourth yards, and so on, until they 
  330. finally reach the goal on the last play.  That is how exchange sorting 
  331. moves the ball.
  332.  
  333. Alphasort moves the ball farther on each play.  Instead of moving half 
  334. way to the goal, it moves the ball 26 times closer to the goal (in the 
  335. case of alphabetic sorting) or 10 times closer to the goal (in the 
  336. case of numeric sorting).
  337.  
  338.  
  339.  
  340. 4.  COMPARISON TO SORTING BY DISTRIBUTION
  341.  
  342.  
  343. In contrast to quicksort, which uses compares, sorting by distribution 
  344. does not use compares.  It is a radix method like Alphasort.
  345.  
  346. This discussion of sorting by distribution is based on Knuth's 
  347. description of the method in his volume, "Sorting and Searching."
  348.  
  349. Sorting by distribution distributes items in the list into "piles."  
  350. The piles correspond to digits, such as the A pile for all items 
  351. beginning with A, and so on.  The main problem of radix sorting by 
  352. distribution is what to do with the piles.  "In order to handle radix 
  353. sorting inside a computer, we must decide what to do with the piles" 
  354. (page 171).  Setting aside a pile for each letter of the alphabet (M 
  355. piles) proved unsatisfactory "since each area must be large enough to 
  356. hold N items. . . .  Such an excessive memory requirement originally 
  357. caused most people to reject the idea of radix sorting within a 
  358. computer, until H.H. Seward . . . pointed out that we can achieve the 
  359. same effect with only 2N record areas and M count fields. We simply 
  360. count how many elements will lie in each of the M piles, by making a 
  361. preliminary pass over the data; this tells us precisely how to 
  362. allocate memory for the piles" (pages 171-172).  Therefore, the 
  363. problem of the piles is solved at the expense of an extra pass, a 
  364. "preliminary pass" as the book calls it.
  365.  
  366. How does Alphasort solve the problem of the piles?  Instead of 
  367. squeezing the memory down to 2N record areas as above, Alphasort 
  368. uses only one N record area in which the items are stored.  In 
  369. addition, it uses an array of integers one N in size.  The bottom line 
  370. is that it requires less memory than the textbook method.
  371.  
  372. The textbook method reduces memory requirements at the expense of an 
  373. extra "preliminary pass."  However, Alphasort does not require an 
  374. extra "preliminary pass."  It doesn't need this extra pass, because 
  375. Alphasort does not count how many items go into each pile.  It has 
  376. another way of keeping track of the piles, and it's not by counting.  
  377. The bottom line is that Alphasort needs fewer passes than the textbook 
  378. method, approximately half as many.
  379.  
  380. As a rule, in computer programming, you gain efficiency at the expense 
  381. of memory.  In this case, however, the reverse is true.  Alphasort 
  382. uses less memory, but it also accomplishes the sort with fewer passes.
  383.  
  384. The textbook suggests an alternative solution to the problem of the 
  385. piles.  The alternative involves a linking mechanism.  Records are 
  386. linked to one another in such a way that the program follows the links 
  387. rather than moving the records themselves.  This is getting closer to 
  388. Alphasort's method; so let's take a look at the linking mechanism.
  389.  
  390. The textbook linking method uses links which point to both the top of 
  391. the pile and the bottom of the pile.  Alphasort, on the other hand, 
  392. uses links which point to only one end of the pile.  This is half as 
  393. many links to keep track of.
  394.  
  395. What does the textbook conclude about sorting by distribution (radix 
  396. sorting)?  Page 177 reads "Therefore radix sorting is usually more 
  397. efficient than any other known method for internal sorting on such 
  398. machines, provided that N is not too small and the keys are not too 
  399. long."  In other words, radix sorting is more efficient sometimes, but 
  400. not in two cases: (1) when the list is short, and (2) when the items 
  401. in the list are long.
  402.  
  403. How would Alphasort rate if Knuth had known about it when he wrote the 
  404. book?  Regarding case 1, short lists, we have seen in the first 
  405. section above, that Alphasort sorts both short and long lists equally 
  406. well.  Regarding case 2, long items, we also have seen in the first 
  407. section above, that Alphasort is not ordinarily hindered by long items, 
  408. assuming there is not an overabundance of duplicates in the list.
  409.  
  410. I suppose that these two cases has prevented radix sorting from more 
  411. common use.  Since many applications deal with short lists or long 
  412. items, then radix sorting has not often become the method of choice.  
  413. But Alphasort avoids both limitations because it sorts from the most 
  414. significant digit instead of the least significant digit.
  415.  
  416. The textbook recognizes the value of most significant digit (MSD) 
  417. sorting, if such a thing were possible, but it can't quite figure out 
  418. how to manipulate the computer's memory in order to accomplish it.  
  419. "In our analysis of radix-exchange sorting, we found that it was 
  420. unnecessary to inspect many bits of the key, when we approach the keys 
  421. from the left instead of the right.  Let us therefore reconsider the 
  422. idea of a radix sort which starts at the most signficant digit (MSD) 
  423. instead of the least significant digit (LSD). . . . an MSD-first radix 
  424. method suggests itself naturally. . . .  This principle of `divide and 
  425. conquer' is quite appealing, and the only reason it doesn't work 
  426. especially well for sorting punched cards is that the multiplicity of 
  427. piles tends to become confusing" (page 177).
  428.  
  429. The "multiplicity of piles."  That's the problem.
  430.  
  431. The textbook continues:  "Perhaps the best compromise has been 
  432. suggested by M.D. MacLaren . . . who recommends an LSD-first sort . . .
  433. but applied only to the most significant digits. This does not 
  434. completely sort the file, but it usually brings the file very nearly 
  435. into order so that very few inversions remain; therefore straight 
  436. insertion can be used to finish up" (page 177).
  437.  
  438. A "best compromise" solution that partially sorts the file.
  439.  
  440. Alphasort surmounts the compromise with a unique memory-handling 
  441. technique which we will examine in the last section of this paper 
  442. which compares Alphasort to a prior patent.  Alphasort's method of 
  443. keeping track of the "piles" allows it to start at the most 
  444. significant digit, and therefore, it matters not if the list is long 
  445. or short, or if the items are long or short.
  446.  
  447.  
  448.  
  449. 5.  COMPARISON TO SORTING BY ADDRESS CALCULATION
  450.  
  451.  
  452. If I handed you a deck of cards to sort, and asked you to lay them out 
  453. in numerical order on the table in front of you, I think you have a 
  454. pretty good idea of how you would do it.  If your first card were an 
  455. ace, then you would put it to the far left on the table.  Why not put 
  456. it in the middle of the table?  Because you already know that ace is 
  457. the lowest number.  So it goes to the left.  When you turn over a 7, 
  458. then you would put it in the middle of the table, because you know it 
  459. is the middle number.
  460.  
  461. Knowing ahead of time the range of values, you sort more efficiently.  
  462. Most computer sorting methods, however, sort by trial and error. 
  463. Give the same card sorting job to a computer, and it would do the 
  464. equivalent of blindly placing the first card in the middle, even if it 
  465. were an ace.  Then it would compare the second card to the first 
  466. before it knew where to place the second card.  Compare and move, 
  467. compare and move, until finally the list ends up in the right order.
  468.  
  469. Sorting by address calculation attempts to avoid much of the trial and 
  470. error of other sorting algorithms.  Such an idea was first suggested in 
  471. 1956 by Isaac and Singleton (ACM Journal, vol. 3).  They devised a 
  472. method similar to how you would sort a deck of cards on a table. 
  473. The algorithm first determines the range of the list by a preliminary 
  474. pass on the entire list or on a sample portion of it.  Using this 
  475. knowledge about the range, the algorithm then places items one by one 
  476. in the approximate memory location where they belong.  If it attempts to 
  477. put an item in a memory location that is already occupied by another 
  478. item, then it compares the two items, looks for the nearest empty 
  479. memory location, and moves adjacent items if necessary.  Allowing more 
  480. memory locations than there are items in the list provides a buffer, 
  481. and that reduces the number of moves needed.  The last step is to get 
  482. rid of the gaps in the extra memory locations by packing the list.  
  483. The key to the success of the method is to reduce the number of moves. 
  484. Isaac and Singleton say, "The fewer times the items have to be moved 
  485. from one location to another, the more efficient the sorting 
  486. process." (p. 169).
  487.  
  488. How efficient is sorting by address calculation?  Isaac and Singleton's 
  489. evaluation is favorable: ". . . estimates indicate that on this 
  490. computer, sorting random numbers with the tested method is more than 
  491. twice as fast as any of the conventional merge-sort methods." (p. 173).
  492.  
  493. Could sorting by address calculation be made even more efficient than 
  494. it already is?  If we could eliminate three steps, then yes, it could 
  495. be made more efficient.  The three steps are: (1) determining the 
  496. range of the list in advance, (2) occasional compares and moves, 
  497. and (3) closing the gaps and packing the list.  On top of these three 
  498. steps, it would be desirable to eliminate the need for the extra 
  499. "buffer" memory.
  500.  
  501. Alphasort can be described as sorting by address calculation, because 
  502. it places items in pre-determined memory locations.  Actually, it 
  503. doesn't place the item itself, because the items are never moved, but 
  504. a pointer to the item goes into the pre-determined memory location.  
  505. So Alphasort works on the same principle as Isaac and Singleton's 
  506. method.
  507.  
  508. How does it differ?  It differs in four ways.  First, Alphasort does 
  509. not determine the range of list in advance.  Before it ever sees the 
  510. list, it already knows what range it will use.  This is the range of 
  511. computer-recognizable characters, which is from 0 to 255 to include 
  512. all of them.  The programmer may narrow the range, depending upon the 
  513. application.  For example, the programmer may decide to narrow the 
  514. range from from 0 to 127.  Or, if the programmer knows there are no 
  515. control codes to be dealt with in the application, then he/she can 
  516. narrow the range even further, starting with 32, for example.  The 
  517. narrower the range, the faster Alphasort works.  But the programmer 
  518. adjusts the range to fit the application.
  519.  
  520. What if a list has an overabundance of items starting with "A"?  Isaac 
  521. and Singleton's method would need to know this in advance, so that it 
  522. can allow extra memory locations for "A" words.  But Alphasort does 
  523. not need to know this in advance.  It matters not whether the list has 
  524. an overabundance of "A" words or an overabundance of "Z" words.  
  525. Therefore, Alphasort does not need to make a preliminary pass over the 
  526. list like Isaac and Singleton's method does.
  527.  
  528. There's a second difference between Alphasort and Issac and Singleton's 
  529. sorting by address calculation.  Alphasort eliminates the need for 
  530. compares and moves altogether.  Isaac and Singleton's method uses 
  531. occasional compares whenever items bump into each other.  In that 
  532. case, items need to be moved over into adjacent empty locations.  
  533. However, Alphasort has a flexibility built into its memory management 
  534. system that avoids the rigid requirement to have empty memory 
  535. buffers available in precise locations.  Even if most of the items 
  536. began with "A," none of the items would have to move over to make room 
  537. for others.
  538.  
  539. There's a third difference.  Alphasort does not need to close the gaps 
  540. in the memory buffers and pack the list.  The items are packed tight 
  541. from start to finish; so this final step is eliminated.
  542.  
  543. The fourth and final difference: Alphasort has no need for extra 
  544. "buffer" memory.  Instead of using extra memory, Alphasort makes 
  545. flexible use of the memory it has.
  546.  
  547. When I say "flexible use of memory," does this mean that items are 
  548. moved within the memory?  No, items are never moved.  By flexible, I 
  549. mean that memory is written over itself.  One location at a time, as 
  550. each word is being processed, a memory location receives a new value.  
  551. We'll discuss memory management more in the final section of this 
  552. paper, when we compare Alphasort to a prior patent.
  553.  
  554.  
  555.  
  556. 6.  COMPARISON TO PATENT NO. 4,809,158
  557.  
  558.  
  559. My Alphasort patent application was initially denied by the patent 
  560. office on the basis of McCauley's prior patent no. 4,809,158 in 1989.  
  561. His is an MSD radix method, and therefore it is similar to Alphasort 
  562. in the fact that it sorts items by examining the digits, starting with 
  563. the first (most significant) digit.  But the two methods differ in 
  564. memory management.
  565.  
  566. In my appeal to the patent office, I pointed out the differences in 
  567. memory management, how Alphasort saves steps, and is therefore more 
  568. efficient.  The uniquness of Alphasort, and therefore its claim to 
  569. patentability, lies in its efficient memory management.
  570.  
  571. The patent examiner accepted the appeal and granted me patent no.  
  572. 5,218,700 in 1993.
  573.  
  574. Both methods group words together according to the characters 
  575. they contain. For example, all words beginning with A are grouped 
  576. together, all words with B are grouped together, and so on.
  577.  
  578. However, Alphasort's implementation of the idea is different than 
  579. McCauley's, because of the different way of tracking groups and 
  580. subgroups of words, and because of a different linking mechanism.
  581.  
  582. McCauley's invention tracks groups of words by remembering the 
  583. first and last word in each group.  We read in his patent, in column 6, 
  584. lines 46-49 says, "Each `bin' is comprised of pointers kept in two 
  585. vectors, the `first pointers vector' (`FPV'), and the `last pointers 
  586. vector' (`LPV')." The following lines go on the explain that these 
  587. two pointers point to the first and last words in the bin.  Column 10, 
  588. lines 62-68 says:  ". . . the bin itself just holds pointers to the 
  589. first and last records of that list (in vectors `FPV' and `LPV').  That 
  590. is, the bins do not need to hold all the pointers to the records in 
  591. each bin, for it is economically sufficient that the system be able to 
  592. locate immediately only the first and last records in each bin." 
  593. Therefore, McCauley's invention uses two pointers to keep track of the 
  594. group of words in each bin.
  595.  
  596. On the other hand, my invention uses only one pointer where 
  597. McCauley's uses two.  Alphasort eliminates the "first pointers 
  598. variable" ("FPV").  This leaves only the "last pointers variable" 
  599. ("LPV"), which is comparable in my invention to lettertracker. 
  600. Lettertracker is a two-dimensional array of integers.  Each memory 
  601. location in lettertracker holds an integer which serves the same 
  602. purpose as McCauley's LPV, pointing to the last, or most recently 
  603. processed word, in a group of words.
  604.  
  605. The reason McCauley uses two pointers for each bin is that he needs 
  606. both in order to re-link the list after each sorting pass.  And herein 
  607. lies the second difference: my invention does not re-link the list 
  608. during the sorting process.
  609.  
  610. Re-linking in McCauley's invention occurs after each sorting pass. 
  611. This is accomplished by connecting the LPV in one group to the FPV in 
  612. the next group, so that the last word in one group points to the first 
  613. word in the next group, and so on, until the entire list is re-linked 
  614. into one unified list.  Column 10, line 54 through column 11, line 20 
  615. explain how the LPV and FPV values are changed in order to accomplish 
  616. this re-linking process.
  617.  
  618. Such re-linking does not occur in my invention, saving steps, 
  619. saving sorting time, and reducing to only one the number of pointer 
  620. variables needed for each group, or bin.
  621.  
  622. Alphasort does use a linking mechanism, but it links only groups of 
  623. words rather than linking the entire list.  The linking mechanism in 
  624. my invention is called wordtracker.  After lettertracker points to the 
  625. most recent word in a group, wordtracker tracks down the rest of the 
  626. words in that group.  As groups are subdivided into smaller and 
  627. smaller groups, as is the manner in radix sorting, wordtracker also 
  628. keeps track of these smaller subgroups.  But Alphasort never re-links 
  629. the entire list during intermediate stages of the sorting process as 
  630. McCauley's invention does.
  631.  
  632. Therefore, Alphasort's linking mechanism is different than McCauley's 
  633. because it performs fewer steps.
  634.  
  635. Fewer steps in the sorting process result in significantly faster 
  636. sorting times.  Timed tests on my 386 IBM-compatible personal computer 
  637. corroborate this.  Using a 4-character key comprised of 256 random 
  638. characters, as McCauley did, a list 2000 long sorted 3.89 times faster 
  639. than quicksort.  A list 8000 long sorted 4.39 times faster
  640. than quicksort.
  641.  
  642. McCauley also compared his method to quicksort, and these numbers show 
  643. significant improvement over the relative efficiency given by McCauley.  
  644. It is difficult to determine his precise numbers, because his results 
  645. show on a graph from which I could only estimate the exact numbers.  
  646. However, his graphical representation, compared to my numbers for 
  647. Alphasort, are sufficient to show that Alphasort runs significantly 
  648. faster.
  649.  
  650. If 128 random characters are used instead of 256, the sorting times 
  651. for Alphasort improve even more. In this case, a list 2000 long 
  652. sorted 4.60 times faster than quicksort, and a list 8000 long sorted 
  653. 5.79 times faster than quicksort.
  654.  
  655. These faster sorting times are made possible by eliminating the extra 
  656. steps; namely by keeping track of only one pointer per bin instead of 
  657. two, and by skipping the re-linking process after each sorting pass.
  658.  
  659. How does Alphasort manage memory so that it can skip these extra 
  660. steps?  Does it use extra memory in order to gain efficiency?  No, it 
  661. uses a mimimal amount of memory.  The memory needed consists of two 
  662. large arrays and one small array.  First, an array of strings stores 
  663. the list being sorted.  Second, an array of integers (called 
  664. wordtracker) stores pointers to items in the list.  These two large 
  665. arrays are no larger than the size of the list being sorted.  No 
  666. buffers are needed, no extra room is required, because items are not 
  667. moved, swapped, packed, or consolidated.
  668.  
  669. The final array, the small one, is a two-dimensional array of 
  670. integers.  One dimension corresponds to the range of possible digits 
  671. (such as A through Z; or in computer terms, characters 0 through 255 
  672. or 0 through 127).  The other dimension corresponds to the possible 
  673. width of the items (such as 30 if sorting a database whose largest 
  674. field is 30 characters long).  This array I call lettertracker.  One 
  675. dimension of the array keeps track of which letter of the word is 
  676. being examined, whether it be the first letter, second letter, third 
  677. letter, and so on.  The other dimension keeps track of which character 
  678. is being examined, whether it be A, or B, or C and so on.
  679.  
  680. Therefore, any particular location of the lettertracker array 
  681. corresponds to a certain character and to the position of that 
  682. character.  Since lettertracker is a two-dimensional array, the 
  683. indexes of the array track those two things.  This array roughly 
  684. corresponds to McCauley's bins which store First Pointers Vector and 
  685. Last Pointers Vector.  The main difference is that lettertracker 
  686. points to only one end, instead of both ends, of a group of records.  
  687. In other words, to use McCauley's terms, the array holds Last Pointers 
  688. Vectors.  It does not track First Pointers Vectors at all.
  689.  
  690. Remember, it is necessary to track only one set of pointers because 
  691. the list never needs to be re-linked and consolidated.
  692.  
  693. The value stored at any particular location in lettertracker is an 
  694. integer which acts as a pointer.  The integer points to an index in 
  695. the wordtracker array.  Thus, these two integer arrays work hand-in- 
  696. hand.  Lettertracker (the smaller array) and wordtracker (the larger 
  697. array) cooperate in keeping track of groups and subgroups of items 
  698. during the sorting process.  The way they work together keeps memory 
  699. usage down to the absolute minimum.  Wordtracker, remember, is exactly 
  700. the size of the list, no larger.
  701.  
  702. The long-standing problem of MSD radix sorting, as you recall, is how 
  703. to keep track of the "piles" or "bins."  These piles represent groups 
  704. of words within the list.  These groups constantly change during the 
  705. sorting process.  Also, the groups get smaller and more numerous as 
  706. the sorting progresses.
  707.  
  708. The "pile" problem is solved by the two integer arrays, lettertracker 
  709. and wordtracker.  This is how the two work hand-in-hand to keep track 
  710. of the piles.  Lettertracker remembers the last record processed, and 
  711. wordtracker recalls the rest of the group.  First lettertracker points 
  712. to an index in wordtracker.  Then the value at that index of 
  713. wordtracker points to another index in wordtracker.  And the value at 
  714. that index in turn points to another index in wordtracker.  The values 
  715. keep pointing until the value zero is found.  Zero signals the end of 
  716. the group.
  717.  
  718. All of these values which point to indexes in wordtracker also 
  719. correspond to record numbers, namely the number of the record as 
  720. stored in the array of strings.  For example, if the pointer is 7, 
  721. then that corresponds to word number 7, the 7th word in the array of 
  722. strings.
  723.  
  724. To illustrate, suppose that you are one of 26 detectives.  Each 
  725. detective receives one clue on a piece of paper.  Each clue is 
  726. different.  The clue you receive directs you to another clue somewhere 
  727. in the city.  The city has clues placed all over it.  You don't know 
  728. how many clues you will need to find, and you don't know how many of 
  729. the clues scattered throughout the city belong to you and how many 
  730. belong to one of the other 25 detectives.  You follow the clues one by 
  731. one, each clue leading to one other one, until you reach the last 
  732. clue.  The 26 detectives are like different letters of the alphabet; 
  733. each hunts for a different set of clues just as each letter of the 
  734. alphabet has a different set of words in its pile.  The original 26 
  735. clues given to the 26 detectives are like the lettertracker array; 
  736. each memory location of lettertracker doesn't reveal much about the 
  737. entire pile, but it points to the next word in the pile, and that is 
  738. sufficient.  The clues scattered throughout the city are like the 
  739. wordtracker array; the words of each pile are not contiguous, but as 
  740. one word points to another word, the entire pile can be found.
  741.  
  742. Let's make the detective illustration work backwards.  Before you go 
  743. off looking for your next clue, suppose I take your clue from you and 
  744. hand you another.  The clue I take from you I hide somewhere in the 
  745. city.  The clue I hide will be the first one you find, because the clue 
  746. I just handed you will direct you to it.  This is what happens as words 
  747. are read from disk.  The most recent word pointer (like the clue in the 
  748. detective's hand) is stored into lettertracker.  The word pointer that 
  749. was in lettertracker (like the clue I took from you) is stored into 
  750. wordtracker.  So word pointers are stored and retrieved in opposite 
  751. fashion.
  752.  
  753. As a pile is being retrieved, it is being subdivided into smaller 
  754. piles.  As this happens, values in wordtracker change, one by one, as 
  755. each word is processed, with the result that the words are linked 
  756. together in new ways according to the new piles.
  757.  
  758. Big piles are divided into smaller and smaller piles, until only one 
  759. word remains in each pile.  If you were sorting a large stack of cards 
  760. on the floor, the floor would quickly become filled with little piles 
  761. everywhere, and you would run out of space.  But the two arrays 
  762. lettertracker and wordtracker work hand-in-hand to manage the piles 
  763. without additional memory space.
  764.  
  765. And in this case, efficient use of memory also translates into 
  766. efficient use of time.  The result is faster sorting.
  767.  
  768. The core of the algorithm is a repeat loop that contains 6 lines of 
  769. code.  To inquire about obtaining the source code and permission to 
  770. use it, contact:
  771.      Al Beechick, P.O. Box 899, Pollock Pines, CA 95726
  772.      Phone: (916) 644-2341
  773.