Lewati ke konten utama

Subbab 2.1 String: Tinjauan Awal

Misalkan \(n\) sebuah bilangan bulat positif. Di seluruh buku ini, kita akan menggunakan notasi ringkas \([n]\) untuk menyatakan himpunan beranggota \(n\text{,}\) yaitu \(\{1,2,\dots,n\}\text{.}\) Sekarang, misalkan \(X\) sebuah himpunan. Fungsi \(s\colon[n]\rightarrow X\) juga disebut string atas \(X\) dengan panjang \(n\). Dalam pembahasan mengenai string atas \(X\text{,}\) elemen-elemen \(X\) lazim disebut karakter, sedangkan elemen \(s(i)\) merupakan karakter \(i^{\text{th} }\) dari \(s\text{.}\) Jika memungkinkan, kita lebih suka menyatakan sebuah string \(s\) dengan menulis \(s=\)\(x_1x_2x_3\dots x_n\)”, alih-alih menggunakan notasi yang lebih panjang \(s(1)=x_1\text{,}\) \(s(2)=x_2\text{,}\) …, \(s(n)=x_n\text{.}\)
Terdapat beberapa pilihan lain untuk notasi dan istilah yang berkaitan dengan string. Pertama, karakter-karakter dalam sebuah string \(s\) sering ditulis dengan subskrip sebagai \(s_1,s_2,\dots,s_n\text{,}\) sehingga suku \(i^{\text{th} }\) dari \(s\) dapat dinyatakan dengan \(s_i\) alih-alih \(s(i)\text{.}\) String juga disebut barisan, terutama ketika \(X\) merupakan himpunan bilangan dan fungsi \(s\) didefinisikan oleh suatu aturan aljabar. Sebagai contoh, barisan bilangan bulat ganjil didefinisikan oleh \(s_i=2i-1\text{.}\)
Sebagai pilihan lain, string disebut kata, himpunan \(X\) disebut alfabet, dan elemen-elemen \(X\) disebut huruf. Sebagai contoh, \(aababbccabcbb\) merupakan kata sepanjang \(13\) huruf pada alfabet \(3\) huruf \(\{a,b,c\}\text{.}\)
Dalam banyak bahasa pemrograman, string disebut larik. Selain itu, ketika karakter \(s(i)\) dibatasi agar termasuk dalam suatu himpunan bagian \(X_i\subseteq X\text{,}\) sebuah string dapat dipandang sebagai elemen hasil kali Kartesius \(X_1\times X_2\times \dots\times X_n\text{,}\) yang biasanya dipandang sebagai tupel-\(n\) berbentuk \((x_1,x_2,\dots,x_n)\) sedemikian sehingga \(x_i\in X_i\) untuk setiap \(i\in [n]\text{.}\)

Contoh 2.1.

Di negara bagian Georgia, pelat nomor terdiri atas empat digit, diikuti sebuah spasi, lalu tiga huruf kapital. Digit pertama tidak boleh bernilai \(0\text{.}\) Berapa banyak pelat nomor yang mungkin?
Penyelesaian.
Misalkan \(X\) terdiri atas digit-digit \(\{0,1,2,\dots,9\}\text{,}\) misalkan \(Y\) adalah himpunan yang hanya mempunyai satu elemen, yaitu spasi, dan misalkan \(Z\) menyatakan himpunan huruf kapital. Sebuah pelat nomor yang sah tidak lain adalah string dari
\begin{equation*} (X-\{0\})\times X\times X\times X\times Y\times Z\times Z\times Z \end{equation*}
sehingga banyaknya pelat nomor yang berbeda adalah \(9\times10^3\times1\times 26^3=158\,184\,000\text{,}\) karena kardinalitas hasil kali himpunan sama dengan hasil kali kardinalitas himpunan-himpunan tersebut. Kita dapat memahami alasan di balik hasil ini dengan hanya memperhatikan bagian digit string tersebut. Bagian digit itu dapat kita bayangkan sebagai empat tempat kosong yang perlu diisi. Tempat kosong pertama memiliki \(9\) pilihan (digit \(1\) sampai \(9\)). Jika kita hanya memperhatikan string digit yang diawali \(1\text{,}\) salah satu cara memandangnya adalah bahwa string itu berkisar dari \(1000\) hingga \(1999\text{,}\) sehingga terdapat \(1000\) string. Namun, kita juga dapat memandangnya sebagai \(10\) pilihan untuk posisi kedua, \(10\) pilihan untuk posisi ketiga, dan \(10\) pilihan untuk posisi keempat. Perkalian \(10\times 10\times 10\) menghasilkan \(1000\text{.}\) Karena analisis kita untuk mengisi tempat-tempat digit lainnya tidak bergantung pada pilihan \(1\) di posisi pertama, masing-masing dari \(9\) pilihan digit awal menghasilkan \(1\,000\) string, sehingga jumlahnya \(9\,000 = 9\times 10^3\text{.}\)
Dalam kasus \(X=\{0,1\}\text{,}\) sebuah string atas \(X\) disebut string \(0\)\(1\) (juga disebut string biner atau string bit.). Ketika \(X=\{0,1,2\}\text{,}\) sebuah string atas \(X\) juga disebut string terner.

Contoh 2.2.

Sebuah instruksi mesin dalam sistem operasi \(32\)-bit tidak lain adalah string bit dengan panjang \(32\text{.}\) Jadi, tersedia \(2\) pilihan untuk masing-masing dari \(32\) posisi yang harus diisi, sehingga banyaknya string semacam itu adalah \(2^{32} = 4\,294\,967\,296\text{.}\) Secara umum, banyaknya string bit dengan panjang \(n\) adalah \(2^n\text{.}\)

Contoh 2.3.

Andaikan sebuah situs web mengizinkan penggunanya memilih sendiri nama pengguna untuk akun mereka, tetapi memberlakukan beberapa pembatasan. Karakter pertama harus berupa huruf kapital dalam alfabet Inggris. Karakter kedua hingga keenam dapat berupa huruf dalam alfabet Inggris (baik huruf kapital maupun huruf kecil) atau digit desimal (\(0\)\(9\)). Posisi ketujuh harus berupa ‘@’ atau ‘.’. Posisi kedelapan hingga kedua belas dapat diisi dengan huruf kecil dalam alfabet Inggris, ‘*’, ‘%’, atau ‘#’. Posisi ketiga belas harus berupa sebuah digit. Berapa banyak pengguna berbeda yang dapat didaftarkan oleh situs web tersebut?
Penyelesaian.
Kita dapat menggambarkan pilihan-pilihan tersebut dengan membayangkan \(13\) posisi dalam string sebagai tempat kosong yang harus diisi, lalu menempatkan pilihan untuk setiap tempat kosong di atasnya. Dalam Gambar 2.4, kita menggunakan U untuk menyatakan himpunan huruf kapital, L untuk himpunan huruf kecil, dan D untuk himpunan digit.
# # # # #
D D D D D % % % % %
L L L L L . * * * * *
U U U U U U @ L L L L L D
26 62 62 62 62 62 2 29 29 29 29 29 10
Gambar 2.4. Templat String
Di bawah setiap posisi dalam string, kita menuliskan banyaknya pilihan untuk posisi tersebut. (Sebagai contoh, terdapat 62 pilihan untuk posisi kedua karena ada \(52\) huruf setelah huruf kapital dan huruf kecil sama-sama diperhitungkan, serta \(10\) digit.) Kemudian kita mengalikan banyaknya pilihan untuk setiap posisi karena setiap pilihan tidak bergantung pada pilihan lainnya. Dengan demikian, banyaknya nama pengguna yang mungkin adalah
\begin{equation*} 26\times 62^5 \times 2 \times 29^5\times 10 = 9\,771\,287\,250\,890\,863\,360 \end{equation*}
.