首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 計算 20902 個漢字拼音首字母:高性能查表法

     編輯:關於C語言

演算法核心思想

利用 Unicode 編碼區塊特性:CJK 統一表意文字基本區塊範圍 U+4E00 (19968) ~ U+9FFF (40879),共 20902 字。將每個漢字的拼音首字母預計算存入字串查表,運行時通過 索引 = 字符碼 - 19968 直接 O(1) 定位。

完整實現代碼

/// 
/// 獲取字串的漢語拼音首字母代碼(僅大寫字母)
/// 
public static string ToChineseSpell(string strText)
{
    if (string.IsNullOrEmpty(strText)) return strText;

    var sb = new System.Text.StringBuilder();
    foreach (char ch in strText)
    {
        // 英文字母直接大寫輸出
        if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
        {
            sb.Append(char.ToUpper(ch));
        }
        else
        {
            int index = ch - 19968; // Unicode 起始碼 19968 (0x4E00)
            if (index >= 0 && index < strChineseFirstPY.Length)
                sb.Append(strChineseFirstPY[index]);
            // 非漢字字符(標點、數字等)直接忽略
        }
    }
    return sb.ToString();
}

/// 
/// 20902 個漢字拼音首字母查表字串
/// Unicode 範圍:19968 (0x4E00) ~ 40869 (0x9FA5)
/// 
private static readonly string strChineseFirstPY = 
    "YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJ"
  + "HHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPC"
  + "BZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZ"
  // ... (此處省略中間極長字串,完整長度應為 20902 字符)
  + "XY"; // 結尾片段

關鍵點解析

  • 字串查表:string 本質為 char[],str[index] 直接取字符,無額外分配
  • StringBuilder:避免字串拼接產生大量臨時物件
  • 邊界檢查:index >= 0 && index < Length 防越界
  • 非漢字處理:英文保留大寫,其他字符(標點、數字、日韓漢字擴展區)忽略

效能優勢

方案時間複雜度空間備註
查表法 (本文)O(N)~20 KB單次遍歷,無分支預測失敗
字典O(N)~200 KB+哈希計算開銷大
P/Invoke Windows APIO(N)極小跨邊界調用慢,平台相關
第三方庫O(N)視庫而定依賴外部,部署複雜

局限與擴展

  • 僅首字母:無法區分同音字(如「張」/「章」同為 Z)
  • 基本區塊:不含擴展區 A/B/C/D/E/F(罕用字)
  • 多音字:取最常用讀音,特定場景可能不準
  • 擴展方向:改存完整拼音(含聲調)、支援擴展區、結合詞庫分詞優化多音字

使用範例

string input = "北京歡迎您 ABC 123";
string result = ToChineseSpell(input); // 輸出:BJHYN ABC

總結

查表法以 20 KB 靜態字串 換取 極致查詢速度,是嵌入式、高頻調用、無外部依賴場景的最優選。代碼簡潔、零分配、易移植,堪稱「以空間換時間」的教科書級範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved