タグ付けされた質問 「strings」

シンボルのシーケンス、そのセットとそのプロパティ、および使用法に関する質問。

2
高速スペルチェッカーを構築するための効率的なデータ構造
私はかなり大きな辞書で動作するはずのスペルチェッカーを書こうとしています。Damerau-Levenshtein距離を使用して、スペルミスの単語に最も近い単語を判断するために使用する辞書データを効率的にインデックス化する方法が本当に必要です。 私は、スペースの複雑さとランタイムの複雑さとの間の最適な妥協点を提供するデータ構造を探しています。 インターネットで見つけたものに基づいて、使用するデータ構造のタイプに関していくつかのリードがあります。 トライ これは私の最初の考えであり、実装が非常に簡単に見えるため、高速なルックアップ/挿入を提供するはずです。Damerau-Levenshteinを使用した近似検索は、ここでも簡単に実装できるはずです。しかし、ポインタストレージでは多くのオーバーヘッドが発生する可能性が高いため、スペースの複雑さに関してはあまり効率的ではありません。 パトリシア・トライ 基本的にポインターを保存するコストを回避しているため、これは通常のトライよりもスペースを消費しないようですが、私が持っているような非常に大きな辞書の場合、データの断片化が少し心配です。 サフィックスツリー これについては定かではありませんが、テキストマイニングで便利だと思う人もいるようですが、スペルチェッカーのパフォーマンスの面で何が得られるのかはよくわかりません。 三項検索ツリー これらはかなり見栄えがよく、複雑さの点ではパトリシアトライスに近い(より良い?)はずですが、パトリシアトライスよりも良いか悪いかは分からないでしょう。 バーストツリー これは一種のハイブリッドのようであり、トライスなどに比べてどのような利点があるかはわかりませんが、テキストマイニングには非常に効率的であると何度か読みました。 このコンテキストで使用するのに最適なデータ構造と、他のデータ構造よりも優れている点についてフィードバックを受け取りたいと思います。スペルチェッカーにさらに適切なデータ構造が不足している場合、私も非常に興味があります。

5
興味深いアナグラムを見つける
言うと同じ長さの2つの文字列です。anagramming二つの文字列の全単射写像であるようそれぞれについて、。a1a2…ana1a2…ana_1a_2\ldots a_nb1b2…bnb1b2…bnb_1b_2\ldots b_np:[1…n]→[1…n]p:[1…n]→[1…n]p:[1\ldots n]\to[1\ldots n]ai=bp(i)ai=bp(i)a_i = b_{p(i)}iii 同じ文字列のペアに対して複数のアナグラムが存在する場合があります。例えば、場合 `abcab`と私たちが持っているとなど。a=a=a=b=b=b=cababp1[1,2,3,4,5]→[4,5,1,2,3]p1[1,2,3,4,5]→[4,5,1,2,3]p_1[1,2,3,4,5]\to[4,5,1,2,3]p2[1,2,3,4,5]→[2,5,1,4,3]p2[1,2,3,4,5]→[2,5,1,4,3]p_2[1,2,3,4,5] \to [2,5,1,4,3] アナグラムのの重み は、2番目の文字列を取得するために再配置できるチャンクを取得するために最初の文字列で行う必要のあるカットの数であると言います。正式には、この値の数れる。すなわち、その時点の数であり、はないない、正確1.For例によって増加及び、なぜならカットチャンクに、一度と、及び切り込み4回、5つのチャンクに。w(p)w(p)w(p)pppi∈[1…n−1]i∈[1…n−1]i\in[1\ldots n-1]p(i)+1≠p(i+1)p(i)+1≠p(i+1)p(i)+1\ne p(i+1)pppw(p1)=1w(p1)=1w(p_1) = 1w(p2)=4w(p2)=4w(p_2) = 4p1p1p_11234512345p2p2p_212345 2つの文字列とアナグラムが存在するとします。次に、少なくとも1つのアナグラムの重みを最小にする必要があります。これが一番軽いとしましょう。(最も軽いアナグラムが複数ある場合があります。重みだけに興味があるので気にしません。)aaabbb 質問 アナグラムが存在する2つの文字列が与えられたときに、2つの文字列の最も軽いアナグラムの正確な重みを効率的に生成するアルゴリズムが必要です。アルゴリズムが最も軽いアナグラムを生成する場合でも問題ありませんが、そうする必要はありません。 すべてのアナグラムを生成して重量を量るのは非常に簡単なことですが、多くのアナグラムが存在する可能性があるため、軽いアナグラムを直接検出する方法をお勧めします。 動機 この問題が興味深い理由は次のとおりです。コンピュータに辞書を検索させ、アナグラム、まったく同じ文字を含む単語のペアを見つけるのは非常に簡単です。しかし、作成されるアナグラムの多くは面白くありません。たとえば、Websterの第2国際辞書にある最長の例は次のとおりです。 胆嚢 十二指腸s造設 問題が明らかである:彼らは非常に軽いanagrammingを認めるため、これらの結果がおもしろくであることを単に交換cholecysto、duedenoおよびstomyセクション、一方2.の重量のために、このはるかに短い例では、はるかに意外で面白いです: 海岸線 断面 ここで、最も軽いアナグラムの重みは8です。 この方法を使用して、興味深いアナグラム、つまりすべてのアナグラムの重みが高いアナグラムを見つけるプログラムがあります。しかし、これは、可能なすべてのアナグラムを生成して重み付けすることでこれを行いますが、これは遅いです。

1
これらの文字列操作をサポートする「文字列スタック」データ構造はありますか?
次の操作を実行できる文字セット文字列セットを格納するデータ構造を探しています。文字列のセットSを格納するデータ構造としてD(S )を示します。ΣΣ\SigmaD(S)D(S)\mathcal{D}(S)SSS Add-Prefix-Set上に:いくつかのセットの所定のT大き定数によって制限され、その文字列の長さが一定で、戻りによって囲まれている文字列(空)の、D({ T Sを| T ∈ T 、S ∈ S } )。これらの境界定数は両方ともグローバルです。これらはすべての入力Tで同じです。D(S)D(S)\mathcal{D}(S)TTTD({ts | t∈T,s∈S})D({ts | t∈T,s∈S})\mathcal{D}( \{ t s\ |\ t \in T, s \in S\} )TTT Get-Prefixes上の:リターン{ | S ∈ S 、∈ Σ }。O (| Σ |)時間でその内容を列挙できる限り、このセットにどの構造が使用されるかはあまり気にしないことに注意してください。D(S)D(S)\mathcal{D}(S){a | as∈S,a∈Σ}{a | as∈S,a∈Σ}\{ a \ | \ as \in S, …

1
文字列内の最長の繰り返し(散乱)サブシーケンス
非公式の問題声明: ACCABBABACCABBABACCABBABなどの文字列が与えられたとき、左から右に赤い文字のみを読むと、読むのと同じ結果が得られるように、いくつかの文字を赤、いくつかの文字を青に色付けします。青い文字のみ。 例では、次のように色を付けることができますACCABBABACCABBABA\color{blue}{C}\color{red}{CAB}B\color{blue}{AB} したがって、CABCABCABは繰り返しサブシーケンスであると言いACCABBABACCABBABACCABBABます。また、最長の繰り返しサブシーケンスです(確認しやすい)。 最長の繰り返しサブシーケンスを効率的に計算できますか? 正式な質問: 文字列といくつかのkkkについて、長さ繰り返し部分シーケンスがkkk文字列に存在するかどうかを決定するのはNP困難ですか? その場合:どの問題をこの問題に減らすことができますか? そうでない場合:効率的なアルゴリズムとは何ですか?(明らかに、このアルゴリズムを使用して、最長の繰り返しサブシーケンスを計算できます) ボーナス質問: アルファベットのサイズが定数で制限されている場合、それらは常に長さ繰り返し部分シーケンスになりn/2−o(n)n/2−o(n)n/2 - o(n)ますか? (これはバイナリアルファベットに当てはまることが知られています。) 編集2:ボーナス質問に対する否定的な答えは、少なくとも文字のアルファベットで既に知られています555。実際、サイズがアルファベットの場合、長さが単に最も長い繰り返しサブシーケンスを持つ文字列があります。これを表示するには、ランダムな文字列で十分です。結果はすでに存在していましたが、見落としていました。ΣΣΣO(n⋅Σ−1/2)O(n·Σ−1/2)O(n · Σ^{-1/2}) 編集: 注: 一部の人々は、「サブシーケンス」と言うときに「サブストリング」を意味します。しません。これは、サブストリングを2回見つける問題ではありません。

2
近似ルックアップをサポートする効率的なマップデータ構造
キーの効率的な近似ルックアップ(たとえば、文字列のレーベンシュタイン距離)をサポートし、入力キーに最も近い一致を返すデータ構造を探しています。私がこれまでに見つけた最適なデータ構造はBurkhard-Kellerツリーですが、この目的のために他の/より良いデータ構造があるかどうか疑問に思っていました。 編集:特定のケースの詳細: 文字列は通常、互いに大きなレーベンシュタインの違いを持っ​​ています。 文字列の最大長は約20〜30文字で、平均は10〜12文字に近い。 挿入よりも効率的なルックアップに関心があります。これは、クエリを効率的に行いたい静的データのセットを構築するためです。

1
ドメイン名の圧縮
この質問は、Computer Science Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 任意のIDNホスト名(RFC5890で定義)のドメインを非常にコンパクトに圧縮する方法について興味があり、これが興味深い課題になると思われます。Unicodeホストまたはドメイン名(Uラベル)はUnicode文字の文字列で構成され、通常、トップレベルドメイン(たとえば、ギリシャ文字)に応じて1つの言語に制限され、(対応するラベル)。.grxn-- 正式な要件だけでなく、 各非Unicodeラベルは文字列一致^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?$です; 各Aラベルは、一致する文字列^xn--[a-z\d]([a-z\d\-]{0,57}[a-z\d])?$です。そして ドメイン全体の長さ(Aラベルと '。'区切り文字で連結された非IDNラベル)が255文字を超えない 次のようなさまざまなヒューリスティックからも: 下位Uラベルは、固有名詞や数字(ハイフンを除く句読点、空白が取り除かれ、Nameprepごとに折り畳まれている)を含む一部の自然言語で、字句的、構文的、意味的に有効なフレーズであることが多く、短いフレーズが優先されます。そして 高次ラベルはSLDおよびTLDの辞書から引き出され、低次ラベルで使用される自然言語を予測するためのコンテキストを提供します。 こうした短い文字列を適切に圧縮することは、データのこれらの特定の機能を考慮せずに困難になること、さらに、既存のライブラリがより一般的なユースケースに対応するために不要なオーバーヘッドを生成することを恐れます。 Matt MahoneyのオンラインブックData Compression Explainedを読むと、上記の(および/または他の)モデリングの前提を活用するために多くの既存の手法を使用して、特定のツールよりもはるかに優れた圧縮を実現できることが明らかです。 コンテキストとして、この質問はSOに関する以前の質問からの派生物です。 最初の考え この問題はオフライントレーニングの優れた候補であり、次の行に沿って圧縮データ形式を想定しています。 「パブリックサフィックス」のハフマンコーディング。ドメイン登録またはトラフィックボリュームの公開されたソースから抽出された確率。 残りのUラベルに使用される(自然言語)モデルのハフマンコーディング。ドメインサフィックスのコンテキストを指定して、ドメイン登録またはトラフィックボリュームの公開されたソースから抽出された確率。 指定された自然言語モデルからいくつかの辞書ベースの変換を適用します。そして Uラベル内の各文字の算術コーディングと、オフライントレーニングから派生した文脈適応型自然言語モデルから得られる確率

1
すべての十分に大きい文字列には繰り返しがありますか?
ましょ固定サイズの文字のある有限集合とします。してみましょうαを超えるいくつかの文字列でΣ。私たちは、空でない部分文字列と言うβのαがある繰り返した場合にβ = γ γ、一部の文字列のためのγ。ΣΣ\Sigmaαα\alphaΣΣ\Sigmaββ\betaαα\alphaβ=γγβ=γγ\beta = \gamma \gammaγγ\gamma さて、私の質問は以下が成り立つかどうかです。 すべてのために、いくつか存在するN ∈ N毎に文字列のようなオーバー少なくとも長さの、少なくとも一つの繰り返しが含まれています。ΣΣ\Sigman∈Nn∈Nn \in \mathbb{N}Σ N ααα\alphaΣΣ\Sigmannnαα\alpha 私はバイナリアルファベットでこれを確認しましたが、これはその場合には非常に簡単ですが、サイズ3のアルファベットはすでに確認するのがかなり難しいため、任意の大きな文法の証明が必要です。 上記の推測が当てはまる場合、他の質問で空の文字列を挿入する要求を(ほぼ)削除できます。

1
Ukkonenのアルゴリズムの実行時間はアルファベットサイズにどのように依存しますか?
Ukkonenのアルゴリズムの漸近的な実行時間、おそらく線形(?)時間でサフィックスツリーを構築するための最も一般的なアルゴリズムの問題に関心があります。 これは、ダンガスフィールドによる本「ストリング、ツリー、シーケンスのアルゴリズム」からの引用です(セクション6.5.1)。 "... Aho-Corasick、Weiner、Ukkonen、およびMcCreightアルゴリズムはすべてスペースを必要とするか、O (m )時間境界を最小のO (m log m )およびOに置き換える必要があります(m log |Θ (m | Σ |)Θ(m|Σ|)\Theta(m|\Sigma|)O (m )O(m)O(m)O (m ログm )O(mログ⁡m)O(m \log m) "。O (m ログ| Σ | )O(mログ⁡|Σ|)O(m \log|\Sigma|) [ mmmは文字列の長さ、はアルファベットのサイズ]ΣΣ\Sigma なぜそうなのか分かりません。 スペース:まあ、サイズ配列を使用してノードからの分岐を表す場合、実際、Θ (m | Σ |)スペース使用になります。ただし、私の知る限り、ハッシュテーブル(Pythonの辞書など)を使用してブランチを保存することもできます。その後、O (1 )の子ノードにアクセスできる一方で、すべてのハッシュテーブルにΘ (m )ポインターのみを格納します(ツリーにはΘ (m )エッジがあるため)。Θ (| Σ |)Θ(|Σ|)\Theta(|\Sigma|)Θ (m | Σ …

3
文字列の切断に関する動的プログラミング演習
私はこの本から次の問題に取り組んできました。 特定の文字列処理言語は、文字列を2つの部分に分割する基本的な操作を提供します。この操作には元の文字列のコピーが含まれるため、カットの位置に関係なく、長さnの文字列に対してn単位の時間がかかります。今、文字列を多くの部分に分割したいとします。休憩が行われる順序は、合計実行時間に影響を与える可能性があります。あなたがた位置に20文字の文字列をカットしたい場合たとえば、と、その後の位置に最初のカットを作り、負うの総コスト位置10をしている間、最初のより良いコスト持ち。3333 20 + 17 = 37 20 + 10 = 3010101033320 + 17 = 3720+17=3720 + 17 = 3720 + 10 = 3020+10=3020 + 10 = 30 カットが与えられ、ストリングを個にカットする最小コストを見つける動的プログラミングアルゴリズムが必要です。m + 1mmmm + 1m+1m +1

7
O(1)追加スペースを使用して、2つの文字列が互いの順列であるかどうかを確認する方法は?
2つの文字列が与えられた場合、O(1)スペースを使用して、それらが互いの順列であるかどうかをどのように確認できますか 文字列を変更することは一切許可されていません。 注:文字列の長さとアルファベットのサイズの両方に関連するO(1)スペース。

1
一意の要素を持つリストの距離を編集
リスト間のレーベンシュタイン距離編集距離はよく研究された問題です。しかし、各リストで要素が複数回出現しないことがわかっている場合、可能な改善についてはあまり見つけることができません 。 また、要素が比較可能/ソート可能であると仮定します(ただし、比較するリストは最初からソートされていません)。 O(min(m,n)s)O(min(m,n)s)O(\min(m,n)s)O(min(s,m,n)s)O(min(s,m,n)s)O(\min(s,m,n)s)sss より正式には、 与えられた2つの文字列間の編集距離は 文字が繰り返されないという約束で、どの程度効率的に計算でき ますか?s,t∈Σ∗s,t∈Σ∗s,t \in \Sigma^* ΣΣ\Sigmaは非常に大きなアルファベットです。

2
Aho-CorasickアルゴリズムとRabin-Karpアルゴリズムの比較
複数のパターン検索をサポートする文字列検索アルゴリズムに取り組んでいます。実行時間の点で最も強力な候補のように見える2つのアルゴリズム、すなわちAho-CorasickとRabin-Karpを見つけました。しかし、2つのアルゴリズムの包括的な比較は見つかりませんでした。どのアルゴリズムがより効率的ですか?また、並列計算と複数パターン検索にはどちらが適していますか?最後に、必要なハードウェアリソースが少ないのはどれですか。 ACアルゴリズムの場合、検索フェーズは時間かかりますが、RKの場合はO (n m )です。ただし、RKの実行時間はあり、ACに類似しています。私の暫定的な結論は、RKはACほど多くのメモリを必要としないため、RKは実質的に優れているように見えるということです。あれは正しいですか?O (n + m )O(n+m)O(n+m)O (n m )O(nm)O(nm)O (n + m )O(n+m)O(n+m)

5
O(n)の複雑さで順序付けされた単語の頻度
Java開発者のポジションへのインタビュー中に、私は次のことを尋ねられました。 2つのパラメーターを取る関数を記述します。 テキストドキュメントを表すStringおよび 返すアイテムの数を提供する整数。 最も頻度の高い単語が最初に出現する単語の頻度で並べられた文字列のリストを返すように関数を実装します。ソリューションは時間で実行する必要がありますはドキュメントの文字数です。O(n)O(n)O(n)nnn 以下は私が(疑似コードで)答えたものです、それはソートのためにではなく時間です。どうやって回するのかわからない。 O(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n \log n)O(n)O(n)O(n) wordFrequencyMap = new HashMap<String, Integer>(); words = inputString.split(' '); for (String word : words) { count = wordFrequencyMap.get(word); count = (count == null) ? 1 : ++count; wordFrequencyMap.put(word, count); } return wordFrequencyMap.sortByValue.keys 誰かが知っているか、誰かが私にいくつかのヒントを与えることができますか?

1
最長のフィボナッチ部分文字列を見つけるための単純なアルゴリズムの複雑さ
2つの記号と与えられた場合、番目のフィボナッチ文字列を次のように定義してみましょう:aa\text{a}bb\text{b}kkk F(k)=⎧⎩⎨baF(k−1)⋆F(k−2)if k=0if k=1elseF(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else F(k) = \begin{cases} \text{b} &\mbox{if } k = 0 \\ \text{a} &\mbox{if } k = 1 \\ F(k-1) \star F(k-2) &\mbox{else} \end{cases} 文字列の連結を示します。⋆⋆\star したがって、次のようになります。 F(0)=bF(0)=bF(0) = \text{b} F(1)=aF(1)=aF(1) = \text{a} F(2)=F(1)⋆F(0)=abF(2)=F(1)⋆F(0)=abF(2) = F(1) \star F(0) = \text{ab} F(3)=F(2)⋆F(1)=abaF(3)=F(2)⋆F(1)=abaF(3) = F(2) \star F(1) = \text{aba} …

2
高速k不一致文字列マッチングアルゴリズム
高速なk不一致文字列マッチングアルゴリズムを探しています。長さmのパターン文字列Pと長さnのテキスト文字列Tが与えられた場合、Pが最大でk個の不一致を持つTの部分文字列と一致するすべての位置を見つけるための高速(線形時間)アルゴリズムが必要です。これは、k差問題(編集距離)とは異なります。不一致は、部分文字列とパターンの最大k個の位置に異なる文字があることを意味します。本当に必要なのはk = 1(最大で1つの不一致)だけなので、k = 1の特定のケースに対する高速アルゴリズムでも十分です。アルファベットのサイズは26(大文字と小文字を区別しない英語のテキスト)であるため、スペースの要件はアルファベットのサイズに比例して大きくなりすぎないようにする必要があります(たとえば、FAASTアルゴリズムは、アルファベットのサイズで指数関数的にスペースを取るなど)。タンパク質および遺伝子配列にのみ適しています)。 ダイナミックプログラミングベースのアプローチは、最悪の場合O(mn)になる傾向があり、遅くなります。私はこのためのボイヤー・ムーアアルゴリズムの変更があると信じていますが、私はそのような論文を手に入れることができません。私は学術雑誌や出版物にアクセスするためのサブスクリプションを持っていないので、すべての参照はパブリックドメインにある必要があります。 私は、ポインタ、または自由に入手できるドキュメントへの参照、またはこの問題のアルゴリズム自体に大いに感謝します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.