码迷,mamicode.com
首页 > 其他好文 > 详细

字典树简单运用--》去亿万条城市三字码数据中Check是否存在某个城市三字码

时间:2015-11-07 18:47:35      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

  前言:不知不觉来C***P半年了,过得也算是不好不坏。遇到过出问题只会推给开发,一直抱怨却提不出方案的业务;也遇到过大V开头(可以问度娘)的水的冒泡的开发。

          有两件小事和大家分享一下:

          1)我们组的接口调用某个外部接口,有些条件下该外部接口会直接把exception(堆栈信息,代码物理路径也有。。)抛给我们,我邮件给相关的测试和开发,

              不出意外,没有回复;后来不知道他们搞什么鬼,想让我们把这个exception也Log下来。。。

          2)说起这个大V开头的,也是我们要调用的某个外部接口的开发。简单描述一下:一次做一个紧急的变更,我这把在特定的条件下,要传一个string类型的Code给他们,

              特定条件不满足就不传递(也就是null),他们要和数据库存储的Code做相等比较,然后告诉我某个产品是不是某家航司定投产品(有点智商的人都知道要返一个bool     值)。

              这个大V开头的,不用string.Equals(不区分大小写),而是使用Contains。。我无所谓,我要的就是一个bool值。  结果这X把Code原样返回给我,要我自己再做一次字符串比较。不想跟这种水货说太多,我忍了,自己比就比吧。

              不要以为这样就完了,在某个郁闷的下午,他和他们的测试,在lync上说我们调用他们的接口时,会抛异常。于是我给他们要异常的详细信息,大体是:“System.Argumentexception        NullReferenceException   in    String.Contains(String A, String B, StringCompare.*****)”,想必大家都明白怎么回事了,

我就在lync上问有没有做字符串的String.IsNullOrEmpty的Check,这X一口咬定说做了,并且坚持说是我们传参的问题。。。好吧,僵持了好长一会,毕竟本人级别不高,就去把事情给我师父说了,我师父去找他当面交涉,回来给我说:这件事你不用管了,不是我们的问题。看得出来,搞得我师父心情也不是很好。

 

          算了,生活和工作难免会遇到各种问题和渣渣,但是我很幸运来这边,是我师父和我leader面试的我,并且来到了我在的team,去做好每一个变更和项目,去把O(N^2)

优化成O(Log N),乃至O(N),去把简单重复的事情做到极致!

 

          订好元旦去西安玩的往返机票,打算这段时间把数据结构和常规的算法复习整理一下。想起来我来面试时,师父考的我第一个算法,就是该文章的题目;

特从这个开始做起,与大家共享:(刚才废话有点多,请大家勿怪)

         至于字典树的理论,就很简单了,不罗嗦了,贴代码:

    class TrieNode
    {
        public TrieNode[] SonTrieNodes { get; set; }
        public char Value { get; set; }
        public int Num { get; set; }
        public bool IsLastNode { get; set; }

        public TrieNode()
        {
            Num = 1;
            SonTrieNodes = new TrieNode[26];
        }
    }
    public class TrieTree
    {
        private TrieNode _root;

        public TrieTree()
        {
            _root = new TrieNode();
        }

        public void InsertStr(string str)
        {
            if (string.IsNullOrEmpty(str)) return;

            var node = _root;
            var letters = str.ToUpper().ToCharArray();
            foreach (var letter in letters)
            {
                var position = letter - A;
                if (node.SonTrieNodes[position] == null)
                {
                    node.SonTrieNodes[position] = new TrieNode()
                    {
                        Value = letter
                    };
                }
                else
                {
                    node.SonTrieNodes[position].Num++;
                }
                node = node.SonTrieNodes[position];
            }
            node.IsLastNode = true;
        }

        public bool isExistStr(string str)
        {
            if (string.IsNullOrEmpty(str)) return false;

            var node = _root;
            var letters = str.ToUpper().ToCharArray();

            foreach (var letter in letters)
            {
                var position = letter - A;
                if (node.SonTrieNodes[position] == null)
                {
                    return false;
                }
                node = node.SonTrieNodes[position];
            }
            return node.IsLastNode;
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            var trieTree = new TrieTree();
            string[] cities = {"HKG","SEL","NYC","SHA",
                              "BJS","SIN","BKK"};
            foreach (var city in cities)
            {
                trieTree.InsertStr(city);
            }
            Console.WriteLine("是否存在SEL:");
            Console.WriteLine(trieTree.isExistStr("SEL"));

            Console.WriteLine("是否存在TYO:");
            Console.WriteLine(trieTree.isExistStr("TYO"));
            Console.Read();
        }
    }

技术分享

 

 

至于,像输入一个字符,自动选择框提示该字符开头的城市、景点之类的,以及支持中文、拼音等;就可以利用字典树做变换,大家有兴趣可以自己玩玩。

 

祝大家周末愉快。

 

字典树简单运用--》去亿万条城市三字码数据中Check是否存在某个城市三字码

标签:

原文地址:http://www.cnblogs.com/qust/p/4945790.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!