- Weşand li ser
Serpêhatiyên gelemperî yên di nivîsandina dîroka TypeScript de derbas kirin
- Nivîskar
- Nav
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
https://github.com/ImBIOS/common-char-extractor-ts
Repêya GitHub:Di nav hewldanên kodkirinê yên hevpeyvînê de, pirsgirêkên algorîtmayî ne tenê wekî ceribandinên zanîna teknîkî dixebitin, lê wekî pencereyên ji bo têgihîştina çareserkirina pirsgirêkan a berbijêrên. Yek ji van pirsgirêkên balkêş, ku pir caran tê dîtin, li dora manîpûlasyona rêzê digere - jêhatîyek bingehîn di arsenala pêşdebiran de. Îro, em têkevin nav pirsgirêkek giring: diyarkirina karakterên hevpar di nav çend rêzan de, û çawa me ji bo çareserkirina wê bi TypeScript re nêzîk bû.
Pirsgirêk Ji Nû Ve Hate Veşartin
Erka me ya dest pê kir, bi awayekî rasterast lê bi xapandinê dijwar bû: ji me re hat daxwaz kirin ku em fonksiyonek binivîsin ku rêzek ji karakterên ku di heman pozîsyonê de di nav hemî rêzan de xuya dikin derxe û vegerîne, dema ku rêzek ji rêzan me re hatibû dayîn. Mînakî, dema ku têketina ["abcd", "bcd", "cde", "cdef"]
me re hatibû dayîn, derketina tê çaverê kirin ["c", "d"]
bû, ku nîşan dide ku 'c' û 'd' karakterên hevpar in ku di nav hemî rêzan de di pozîsyonên xwe yên hevbeş de têne parve kirin.
Çêkirina çareserkirinê
Rêwîtiya me dest pê kir bi hilbijartina TypeScript ji bo çareserkirinê - biryareke ku ji hêla pergala celebê xurt a TypeScript ve hatî birêvebirin, pêbaweriya kodê û berhemdariya pêşdebiran zêde kir. Pêngava destpêkê di nav her karakterê rêza yekem de dubarekirin hebû, bi karanîna wê wekî referansek ji bo berhevkirinê bi karakterên hevbeş di rêzên paşerojê de.
/**
* Rêzek ji karakterên ku di heman pozîsyonê de xuya dikin derxe û vegerîne
* di nav hemî rêzan de di nav rêza têketinê de.
*
* @param {string[]} words - Rêzek ji rêzan ku divê werin analîz kirin.
* @returns {string[]} Rêzek ji karakterên ku di nav hemî rêzên ku hatine dayîn de hevpar in,
* bi parastina rêza xwe ya xuya di rêza yekem de.
*/
export function extractCommonLetters(words: string[]): string[] {
if (words.length === 0) {
return []
}
const copiedWords = [...words]
const result: string[] = []
const referenceWord = copiedWords[0]
// Li ser her karakterê di peyvê yekem de dubare bike
for (let i = 0; i < referenceWord.length; i++) {
const currentChar = referenceWord[i]
let isCharCommonAcrossWords = true
// Kontrol bike ka karakterê heyî di her yek ji peyvên din de heye
for (let j = 1; j < copiedWords.length; j++) {
const word = copiedWords[j]
const charIndex = word.indexOf(currentChar)
// Heke karakter neyê dîtin, bişkîne û ala nîşan bide ku derew e
if (charIndex === -1) {
isCharCommonAcrossWords = false
break
} else {
// Karakterê ku hat dîtin ji peyvê derxe da ku bi duplikatên xwe re mijûl bibe
copiedWords[j] = word.slice(0, charIndex) + word.slice(charIndex + 1)
}
}
// Heke karakter di nav hemî peyvên de hevpar be, wê li encamê zêde bike
if (isCharCommonAcrossWords) {
result.push(currentChar)
}
}
return result
}
Ev beş, esasa nêzîkatiya me digire, balê dikişîne ser xwendina hêsan û lojîkek rasterast ji bo çareserkirina pirsgirêkê.
Serdanek Derveyî: Ceribandina Çareserkirinê
Ji bo pejirandina çareserkirina xwe, me komek ji dozên ceribandinê bikar anî ku gelek senaryoyan vedihewîne - ji dozên bingehîn heta yên tevlihevtir ku karakterên taybet û hesasiyeta rewşê vedihewînin. Ev ceribandina berfireh pê ewle bû ku algoritmaya me di çarçoveya gelek têketinan de berxwedêr û rast e.
Analîzkirina Tevliheviya Cîh û Dem
Piştî lêkolînê, tevliheviya dema çareserkirina me bi seretayî ji hêla hejmara karakterên di rêza yekem de (em ê vê bi N
nîşan bidin) û hejmara giştî ya rêzan (em ê vê bi M
nîşan bidin) ve tê diyarkirin. Ji bo her karakterek di rêza yekem de, em hebûna wê di pozîsyona hevbeş de di nav hemî rêzên din de kontrol dikin, ku dibe sedem ku tevliheviya dema O(N*M) derkeve holê.
Tevliheviya cîhê çareserkirina me O(N) e, ji ber ku em karakterên hevpar di rêzekê de hene. Di rewşa herî xirab de, dema ku hemî karakter di nav hemî rêzan de hevpar in, mezinahiya vê rêzê dê bi dirêjahiya rêza yekem ve pêwendîdar be.
Rêyên Bo Pêşveçûnê
Her çend çareserkirina me ji bo hejmara rêz û karakterên navîn baş e jî, her dem cîhê pêşveçûnê heye. Li vir çend stratejî hene ku performansa wê bêtir baştir bikin:
Daxistina Zû: Heke di her kêliyê de karakterek di pozîsyona xwe ya hevbeş de di nav hemî rêzan de ne li hev be, em dikarin zû ji loopê derkevin, berhevkirinên bêkêr xilas bikin.
Optimîzekirin ji bo Rêzên Kurt: Destpêkirin bi rêza herî kurt wekî referansek, dibe ku dibe sedema kêmkirina hejmara dubarekirinan, ji ber ku ew hejmara herî zêde ya karakterên ku divê werin kontrol kirin kêm dike.
Pêvajoya Paralel: Ji bo daneyên mezin, karanîna teknîkên pêvajoya paralel ji bo berhevkirina karakteran di nav rêzan de bi hevdemî, dikare di demekê de bi girîngî demê kêm bike.
Teknîkên Hashing: Bikaranîna nexşeyek hash ji bo şopandina pozîsyon û hebûnên karakteran, dikare rêyek sofîstîketir pêşkêş bike ji bo nasandina karakterên hevpar, bi taybetî dema ku bi setên berfireh yên rêzan re mijûl dibe.
Bişkokên Dawîn
Pirsgirêka karakterên hevpar, wekî şahidiyek ecêb ji bo zerafeta pirsgirêkên manîpûlasyona rêzê dixebite, pêşdebiran vexwend ku têkevin nav nuansên algorîtmayan û avahiyên daneyan. Bi rêya TypeScript, me ne tenê çareserkirin dît, lê me jî rêwîtiyekê ya zelalî, ewlehiya celeb, û çareserkirina pirsgirêkên bi bandor pêşwazî kir.
Dema ku em bi dawî dibin, divê em bîr bînin ku rêwîtiya di nav pirsgirêkên kodkirinê de, bi qasî ku gihîştina armancê ye, ji rêya ku hatî girtin jî ye. Her pirsgirêk, tevî vê, derfetek yekane pêşkêş dike ji bo baştirkirina jêhatîyên me, nûjenkirina nêzîkatiyên me, û ya herî girîng, berdewamiya fêrbûnê.