コード例 #1
0
ファイル: SuffixArray.cs プロジェクト: zamgi/SuffixArray
        public static SuffixArray <T> .tuple_t[] Build(
            IList <T> objs, int index, int length, IStringValueGetter <T> stringValueGetter)
        {
            CreateIsLetterOrDigitArray();

            var totalSuffixCount = (from value in objs.Skip(index).Take(length)
                                    select GetSuffixCount(stringValueGetter.GetStringValue(value))
                                    ).Sum();
            var suffixIndex = 0;
            var suffixes    = new suffix_t[totalSuffixCount];

            for (int i = index, end = index + length; i < end; i++)
            {
                var str = stringValueGetter.GetStringValue(objs[i]);
                //if ( str == "м.бабий" )
                //System.Diagnostics.Debugger.Break();
                //var __ = GetSuffix( i, str ).Distinct().ToArray();
                foreach (var _suffix in GetSuffixes_v2(i, str).Distinct())
                {
                    suffixes[suffixIndex++] = _suffix;
                }
            }
            Array.Resize <suffix_t>(ref suffixes, suffixIndex);
            Array.Sort <suffix_t>(suffixes, suffixComparison);


            var tuples = new SuffixArray <T> .tuple_t[suffixes.Length];

            suffixIndex = 0;
            var suffix     = suffixes[suffixIndex];
            var suffixText = suffix.Suffix;
            var data       = new SimplyLinkedList <SuffixArray <T> .data_t>();

            tuples[suffixIndex++] = new SuffixArray <T> .tuple_t()
            {
                Suffix = suffixText, Data = data
            };
            data.Add(new SuffixArray <T> .data_t(suffix.SuffixIndex, suffix.WordIndex));
            for (int i = 1, len = suffixes.Length; i < len; i++)
            {
                suffix = suffixes[i];
                if (!suffixText.StartsWith(suffix.Suffix))
                {
                    suffixText            = suffix.Suffix;
                    data                  = new SimplyLinkedList <SuffixArray <T> .data_t>();
                    tuples[suffixIndex++] = new SuffixArray <T> .tuple_t()
                    {
                        Suffix = suffixText, Data = data
                    };
                }
                data.Add(new SuffixArray <T> .data_t(suffix.SuffixIndex, suffix.WordIndex));
            }
            suffixes = null;
            Array.Resize <SuffixArray <T> .tuple_t>(ref tuples, suffixIndex);
            Array.Reverse(tuples);

            DestroyIsLetterOrDigitArray();

            return(tuples);
        }
コード例 #2
0
 internal Enumerator(SimplyLinkedList <T> list)
 {
     _Node    = list._Head;
     _Current = default(T);
 }