好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 算法系列15天速成 第五天 五大經典查找【中】

算法系列15天速成 第五天 五大經典查找【中】

熱門標簽:醫院地圖標注 語音平臺系統 湖北穩定外呼系統 嘟聲的電銷機器人 洛陽便宜外呼系統廠家 忻州外呼系統接口對接 滄州智能外呼系統收費 地圖標注和圖片標注 電銷機器人怎么收費
哈希查找:

    對的,他就是哈希查找,說到哈希,大家肯定要提到哈希函數,呵呵,這東西已經在我們腦子里面形成
固有思維了。大家一定要知道“哈希“中的對應關系。
     比如說: ”5“是一個要保存的數,然后我丟給哈希函數,哈希函數給我返回一個”2",那么此時的”5“
和“2”就建立一種對應關系,這種關系就是所謂的“哈希關系”,在實際應用中也就形成了”2“是key,”5“是value。
    那么有的朋友就會問如何做哈希,首先做哈希必須要遵守兩點原則:
          ①:  key盡可能的分散,也就是我丟一個“6”和“5”給你,你都返回一個“2”,那么這樣的哈希函數不盡完美。
          ②: 哈希函數盡可能的簡單,也就是說丟一個“6”給你,你哈希函數要搞1小時才能給我,這樣也是不好的。

其實常用的做哈希的手法有“五種”:
第一種:”直接定址法“。
                  很容易理解,key=Value+C; 這個“C"是常量。Value+C其實就是一個簡單的哈希函數。
第二種:“除法取余法”。
                  很容易理解, key=value%C;解釋同上。
第三種:“數字分析法”。
                  這種蠻有意思,比如有一組value1=112233,value2=112633,value3=119033,
                  針對這樣的數我們分析數中間兩個數比較波動,其他數不變。那么我們取key的值就可以是
                  key1=22,key2=26,key3=90。
第四種:“平方取中法”。此處忽略,見名識意。
第五種:“折疊法”。
                 這種蠻有意思,比如value=135790,要求key是2位數的散列值。那么我們將value變為13+57+90=160,
                 然后去掉高位“1”,此時key=60,哈哈,這就是他們的哈希關系,這樣做的目的就是key與每一位value都相
                 關,來做到“散列地址”盡可能分散的目地。

正所謂常在河邊走,哪有不濕鞋。哈希也一樣,你哈希函數設計的再好,搞不好哪一次就撞樓了,那么拋給我們的問題
就是如果來解決“散列地址“的沖突。

其實解決沖突常用的手法也就2種:

第一種: “開放地址法“。
                 所謂”開放地址“,其實就是數組中未使用的地址。也就是說,在發生沖突的地方,后到的那個元素(可采用兩種方式
                 :①線性探測,②函數探測)向數組后尋找"開放地址“然后把自己插進入。

第二種:”鏈接法“。
                這個大家暫時不懂也沒關系,我就先介紹一下原理,就是在每個元素上放一個”指針域“,在發生沖突的地方,后到的那
               個元素將自己的數據域拋給沖突中的元素,此時沖突的地方就形成了一個鏈表。

上面啰嗦了那么多,也就是想讓大家在”設計哈希“和”解決沖突“這兩個方面提一點參考和手段。

那么下面就上代碼了,
     設計函數采用:”除法取余法“。
     沖突方面采用:”開放地址線性探測法"。

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HashSearch
{
    class Program
    {
        //“除法取余法”
        static int hashLength = 13;

        //原數據
        static Listint> list = new Listint>() { 13, 29, 27, 28, 26, 30, 38 };

        //哈希表長度
        static int[] hash = new int[hashLength];

        static void Main(string[] args)
        {
            //創建hash
            for (int i = 0; i list.Count; i++)
            {
                InsertHash(hash, hashLength, list[i]);
            }

            Console.WriteLine("Hash數據:" + string.Join(",", hash));

            while (true)
            {
                Console.WriteLine("\n請輸入要查找數字:");
                int result = int.Parse(Console.ReadLine());
                var index = SearchHash(hash, hashLength, result);

                if (index != -1)
                    Console.WriteLine("數字" + result + "在索引的位置是:" + index);
                else
                    Console.WriteLine("嗚嗚," + result + " 在hash中沒有找到!");

            }
        }

        ///summary>
/// Hash表檢索數據
////summary>
///param name="dic">/param>
///param name="hashLength">/param>
///param name="key">/param>
///returns>/returns>
        static int SearchHash(int[] hash, int hashLength, int key)
        {
            //哈希函數
            int hashAddress = key % hashLength;

            //指定hashAdrress對應值存在但不是關鍵值,則用開放尋址法解決
            while (hash[hashAddress] != 0 hash[hashAddress] != key)
            {
                hashAddress = (++hashAddress) % hashLength;
            }

            //查找到了開放單元,表示查找失敗
            if (hash[hashAddress] == 0)
                return -1;
            return hashAddress;

        }

        ///summary>
///數據插入Hash表
////summary>
///param name="dic">哈希表/param>
///param name="hashLength">/param>
///param name="data">/param>
        static void InsertHash(int[] hash, int hashLength, int data)
        {
            //哈希函數
            int hashAddress = data % 13;

            //如果key存在,則說明已經被別人占用,此時必須解決沖突
            while (hash[hashAddress] != 0)
            {
                //用開放尋址法找到
                hashAddress = (++hashAddress) % hashLength;
            }

            //將data存入字典中
            hash[hashAddress] = data;
        }
    }
}

結果:

索引查找:
     一提到“索引”,估計大家第一反應就是“數據庫索引”,對的,其實主鍵建立“索引”,就是方便我們在海量數據中查找。
關于“索引”的知識,估計大家都比我清楚,我就簡單介紹下。
我們自己寫算法來實現索引查找時常使用的三個術語:
第一:主表,      這個很簡單,要查找的對象。
第二:索引項,   一般我們會用函數將一個主表劃分成幾個子表,每個子表建立一個索引,這個索引叫做索引項。
第三:索引表,    索引項的集合也就是索引表。

一般“索引項”包含三種內容:index,start,length

第一: index,也就是索引指向主表的關鍵字。
第二:start, 也就是index在主表中的位置。
第三:length, 也就是子表的區間長度。

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IndexSearchProgram
{
    class Program
    {
        ///summary>
/// 索引項實體
////summary>
        class IndexItem
        {
            //對應主表的值
            public int index;
            //主表記錄區間段的開始位置
            public int start;
            //主表記錄區間段的長度
            public int length;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("原數據為:" + string.Join(",", students));


            int value = 205;

            Console.WriteLine("\n插入數據" + value);

            //將205插入集合中,過索引
            var index = insert(value);

            //如果插入成功,獲取205元素所在的位置
            if (index == 1)
            {
                Console.WriteLine("\n插入后數據:" + string.Join(",", students));
                Console.WriteLine("\n數據元素:205在數組中的位置為 " + indexSearch(205) + "位");
            }

            Console.ReadLine();
        }

        ///summary>
/// 學生主表
////summary>
        static int[] students = {
                                   101,102,103,104,105,0,0,0,0,0,
                                   201,202,203,204,0,0,0,0,0,0,
                                   301,302,303,0,0,0,0,0,0,0
                                };
        ///summary>
///學生索引表
////summary>
        static IndexItem[] indexItem = {
                                  new IndexItem(){ index=1, start=0, length=5},
                                  new IndexItem(){ index=2, start=10, length=4},
                                  new IndexItem(){ index=3, start=20, length=3},
                                };

        ///summary>
/// 查找數據
////summary>
///param name="key">/param>
///returns>/returns>
        public static int indexSearch(int key)
        {
            IndexItem item = null;

            // 建立索引規則
            var index = key / 100;

            //首先去索引找
            for (int i = 0; i indexItem.Count(); i++)
            {
                if (indexItem[i].index == index)
                {
                    item = new IndexItem() { start = indexItem[i].start, length = indexItem[i].length };
                    break;
                }
            }

            //如果item為null,則說明在索引中查找失敗
            if (item == null)
                return -1;

            for (int i = item.start; i item.start + item.length; i++)
            {
                if (students[i] == key)
                {
                    return i;
                }
            }
            return -1;
        }

        ///summary>
/// 插入數據
////summary>
///param name="key">/param>
///returns>/returns>
        public static int insert(int key)
        {
            IndexItem item = null;
            //建立索引規則
            var index = key / 100;
            int i = 0;
            for (i = 0; i indexItem.Count(); i++)
            {
                //獲取到了索引
                if (indexItem[i].index == index)
                {
                    item = new IndexItem()
                    {
                        start = indexItem[i].start,
                        length = indexItem[i].length
                    };
                    break;
                }
            }
            if (item == null)
                return -1;
            //更新主表
            students[item.start + item.length] = key;
            //更新索引表
            indexItem[i].length++;
            return 1;
        }
    }
}

結果:

ps: 哈希查找時間復雜度O(1)。

       索引查找時間復雜度:就拿上面的Demo來說是等于O(n/3)+O(length)

您可能感興趣的文章:
  • 算法系列15天速成 第十四天 圖【上】
  • 算法系列15天速成——第十三天 樹操作【下】
  • 算法系列15天速成 第十二天 樹操作【中】
  • 算法系列15天速成 第十一天 樹操作(上)
  • 算法系列15天速成 第十天 棧
  • 算法系列15天速成 第八天 線性表【下】
  • 算法系列15天速成 第九天 隊列
  • 算法系列15天速成 第七天 線性表【上】
  • 算法系列15天速成 第六天 五大經典查找【下】
  • 算法系列15天速成 第四天 五大經典查找【上】
  • 算法系列15天速成 第三天 七大經典排序【下】
  • 算法系列15天速成 第二天 七大經典排序【中】
  • 算法系列15天速成 第一天 七大經典排序【上】
  • 算法系列15天速成——第十五天 圖【下】(大結局)

標簽:日照 山南 防城港 內蒙古 巴彥淖爾 定州 96 宜賓

巨人網絡通訊聲明:本文標題《算法系列15天速成 第五天 五大經典查找【中】》,本文關鍵詞  算法,系列,15天,速成,第五,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《算法系列15天速成 第五天 五大經典查找【中】》相關的同類信息!
  • 本頁收集關于算法系列15天速成 第五天 五大經典查找【中】的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产精品一区在线观看你懂的| 男主和闺蜜激烈h| 久久久免费看黄A级毛片高清 | 欧美色老妇| 精品美女视频在线观看免费软件| 国产精品久爱在线观看| 成人app18秘?免费破解版| 色情巨乳裸体视频欧美| 嗯啊不要射| 国产精品久久久久精品综合| 伸进胸罩摸到奶头会呻吟| 日本一级婬片A片AAA毛片价格| 再深点灬舒服灬太大了灬爽灬深点| 浪妇荡sao嗯啊~h古代| 国产香蕉尹人综合在线| 在线成人国产| 污黄文| 欧美暴力胖老太bbbbb| 扒开粉嫩小泬舌头伸进去视频在线| 精品偷拍一区二区三区在线看| 穿裙子坐男生身上进去了| 东北老妇xxxxhd| 啊啊啊毛片| 美女被扒开内裤?进去小说 | 免费人做人爱羞羞的网站视频| 国产91?在线播放九色潘多拉| 国内永久免费CRM系统破解版| 床边故事完整版在线观看中文| 欧美性生交XXXXX久久久| 国产尻逼| 爽好大快深点视频观看| 草莓电影院| 孕妇孕交???视频 保胎| 男同志gaygay免费中国| 99性视频| 被邻居侵犯寝取在线播放| 97精品伊人久久久大香线蕉97| 美女双洞齐开| 好男人社区www在线观看高清| 国产精品亲子伦对白| 好深好烫好硬湿了|