Em ciência da computação, o algoritmo de busca de expressões Boyer-Moore (Boyer-Moore string search algorithm) é um eficiente algoritmo de busca que é o padrão de qualidade para busca prática de expressões em literatura. Foi desenvolvido por Robert S. Boyer e J Strother Moore em 1977.[1] O algoritmopré-processa a string sendo procurada (o padrão), mas não a string em que é feito a busca (o texto). É ainda bem aproveitado para aplicações em que o padrão é muito menor do que o texto ou onde persiste por multiplas buscas. O algoritmo BM (Boyer-Moore) usa informação reunida durante o passo de pré-processamento para pular seções do texto, resultando em um constante fator baixo do que muitos outros algoritmos. Em geral, o algoritmo roda mais rápido de acordo com o tamanho do padrão aumenta. As características chaves do algoritmo são combinar na cauda do padrão ao invés da cabeça, e pular pelo texto em deslocamentos de multiplos caracteres ao invés de procurar cada caractere no texto.
Definições
A
N
P
A
N
M
A
N
-
P
A
N
-
-
-
-
-
-
-
P
A
N
-
-
-
-
-
-
-
P
A
N
-
-
-
-
-
-
-
P
A
N
-
-
-
-
-
-
-
P
A
N
-
-
-
-
-
-
-
P
A
N
-
Alinhamentos do padrão PAN ao texto ANPANMAN, de k=3 até k=8. Uma combinação ocorre em k=5.
S[i] denota o caractere no índice i da string S, contando a partir de 1.
S[i..j] denota a substring da string S começando no índice i e terminando em j, incluído.
Um prefixo de S é uma substring S[1..i] para algum i entre [1, n], onde n é o tamanho de S.
Um sufixo de S é uma substring S[i..n] para algum i entre [1, n], onde n é o tamanho de S.
A string a ser procurada é chamada de padrão e é denotada por P. Seu tamanho é n.
A string em que pesquisamos é chamada de texto e é denotada por T. Seu tamanho é m.
Um alinhamento de P até T é um índice k em T até que o último caractere de P esteja alinhado com índice k em T.
Uma combinação ou ocorrência de P acontece no alinhamento se P é equivalente a T[(k-n+1)..k].
Descrição
O algoritmo BM busca por ocorrências de P em T realizando comparações explícitas de caracteres em diferentes alinhamentos. Diferente de uma busca por força bruta em todos os alinhamentos (que são m - n + 1), BM usa informação ganha pelo pré-processamento P para pular quantos alinhamentos forem possíveis.
Antes da introdução desse algoritmo, o caminho usado para buscas em texto era examinar cada caractere do texto pelo primeiro caractere do padrão. Uma vez encontrado, os caracteres subsequentes do texto seriam comparados com os caracteres do padrão. Se nenhuma combinação acontecia, então o texto seria checado de novo caractere por caractere em uma tentativa de achar uma combinação. Assim quase todo caractere em um texto precisa ser examinado.
A chave dentro deste algoritmo é que se o final do padrão é comparado com o texto, então pular pelo texto pode ser feito ao invés de checar cada caractere dele. O motivo disso funcionar é que alinhando o padrão com o texto, o último caractere do padrão é comparado com o caractere do texto. Se os caracteres não baterem, não existe necessidade de continuar buscando por trás pelo padrão. Se o caractere em um texto não combina com nenhum dos caracteres do padrão, então o próximo caractere a ser verificado no texto está localizado a n caracteres de distância pelo texto,onde n é o tamanho do padrão, se o caractere está no padrão, então um deslocamento parcial do padrão pelo texto é feito para alinhar o caractere encontrado e o processo é repetido. O movimento pelo texto em deslocamentos para fazer comparações ao invés de checar cada caractere no texto diminui o número de comparações que deve ser feito, o que é a chave para aumentar a eficiência do algoritmo.
Mais formalmente, o algoritmo começa pelo alinhamento k = n, então o começo de P é alinhado com o começo de T. Caracteres em P e T são então comparados começando pelo índice n em P e k em T, movendo de trás para frente: as strings são comparadas a partir do fim de P até o início de P. As comparações continuam até que ou o início de P é alcançado ( o que significa que é uma combinação) ou uma falha na comparação aconteça fazendo com que o alinhamento pule para a direita de acordo com o valor máximo permitido por um número de regras. As comparações são realizadas novamente no novo alinhamento, e o processo repete até que o alinhamento pule após o fim de T, o que significa que nenhuma combinação será encontrada.
As regras de deslocamento são implementadas como tabelas de consulta em tempo constante, usando tabelas geradas durante o pré-processamento de P.
Regras de Deslocamento
Um deslocamento é calculado aplicando duas regras: a regra do caractere errado e a do sufixo correto. O atual compensamento por deslocamento é o máximo de deslocamentos calculados por estas regras.
A Regra de Caractere Errado
Descrição
-
-
-
-
X
-
-
K
-
-
-
A
N
P
A
N
M
A
N
A
M
-
-
N
N
A
A
M
A
N
-
-
-
-
-
-
N
N
A
A
M
A
N
-
Demonstração da regra de caractere errado com padrão NNAAMAN.
A regra de caractere errado considera o caractere em T em que o processo de comparação falhou (assumindo que tal falha ocorreu). A próxima ocorrência desse caractere à esquerda em P é encontrada, e um deslocamento que traz essa ocorrência em alinhamento com a não ocorrência de combinação em T é proposta. Se o caractere que não combina não ocorre na esquerda de P, um deslocamento é proposto que move inteiramente em P passando o ponto que não combinou.
Pré-processamento
Métodos variam na forma exata em que a tabela para a regra de caractere errado deveria ter, mas uma simples solução de consulta em tempo constante é a seguinte: criar uma tabela 2D que seja indexada primeiro pelo índice do caractere c em um alfabeto e segundo pelo índice i no padrão. Essa consulta resultará a ocorrência de c em P com o índice mais próximo j < i ou -1 se não existe tal ocorrência. O deslocamento proposto será então i - j, com O(1) como tempo de consulta e O(kn) de espaço, assumindo um alfabeto finito de tamanho k.
A Regra do Sufixo Correto
Descrição
-
-
-
-
X
-
-
K
-
-
-
-
-
M
A
N
P
A
N
A
M
A
N
A
P
-
A
N
A
M
P
N
A
M
-
-
-
-
-
-
-
-
-
A
N
A
M
P
N
A
M
-
Demonstração da regra do sufixo correto com padrão ANAMPNAM.
A regra do sufixo correto é marcadamente mais complexa em ambos conceito e implementação do que a regra do caractere errado. É a razão das comparações começarem pelo final do padrão ao invés do início, e é formalmente descrito assim:[2]
Suponha que para um dado alinhamento de P e T, uma substring t de T combina com um sufixo de P, mas uma não combinação ocorre na próxima comparação para a esquerda. Então encontre, se existir, a cópia mais a direita t' de t em P tal que t' não é um sufixo de P e o caractere para a esquerda de t' em P difere do caractere à esquerda de t em P. Desloque P para a direita para que a substring t' em P alinhe-se com a substring t em T. Se t' não existir, então desloque o fim da esquerda de P até o fim de t em T o mínimo possível para que o prefixo do padrão deslocado combine um sufixo de t em T. Se tal deslocamento não for possível, então desloque P por n posições para a direita. Se uma ocorrência de P é encontrada, então desloque P o mínimo possível para que o prefixo apropriado do P deslocado combine com um sufixo da ocorrência de P em T. Se tal deslocamento não for possível, então desloque P por n posições, isso é, desloque P por t.
Pré-processamento
A regra de sufixo correto possui duas tabelas: uma para uso em caso geral, e outra para uso quando ou o caso geral retorne nenhum resultado significativo ou uma combinação ocorre. Estas tabelas serão designadas L e H respectivamente. As definições delas são:[2]
Para cada i, L[i] é maior posição menor que n tal que string P[i..n] combine um sufixo de P[1..L[i]] e que o caractere que precede aquele sufixo não seja igual a P[i-1]. L[i] é definido como zero se não existe posição satisfazendo a condição.
Deixe H[i] denotar o tamanho do maior sufixo de P[i..n] que também é prefixo de P, se existir. Se não existir, deixe H[i] ser zero.
Ambas as tabelas são construidas em tempo O(n) e usadas em espaço O(n). O alinhamento de deslocamento para índice i em P é dado por n - L[i] ou n - H[i]. H deveria somente ser usada se L[i] é zero ou uma combinação foi encontrada.
A Regra de Galil
Uma simples mas importante otimização da BM foi feita por Galil em 1979.[3]
Diferente de deslocamento, a regra de Galil trata de aumentar a velocidade das comparações feitas atualmente em cada alinhamento pulando seções que são conhecidas para combinar. Suponha que em um alinhamento k1, P é comparado com T até o caractere c de T. Então se P é deslocado até k2 até que seu fim à esquerda esteja entre c e k1, na próxima fase de comparação um prefixo de P deve combinar com a substring T[(k2 - n)..k1]. Mesmo se as comparações forem até posição k1 de T, uma ocorrência de P pode ser gravada sem comparação explicita passada por k1. Além do mais, para melhorar a eficiência de Boyer-Moore, a regra Galil é requerida para provar execução em tempo linear no pior caso.
Performance
O algoritmo BM como foi apresentado no documento original tem como pior caso o tempo de O(n+m) somente se o padrão não aparecer no texto. Isso foi primeiramente provado por Knuth, Morris, e Pratt em 1977,[4]
seguido por Guibas e Odlyzko em 1980[5] com um limitante superior de 5m comparações no pior caso. Richard Cole deu uma prova com um limitante superior de 3m comparações no pior caso em 1991.[6]
Quando o padrão ocorre no texto, o tempo de execução do algoritmo original é O(nm) no pior caso. É fácil de ver que quando ambos o padrão e o texto consiste solenemente do mesmo caractere repedito. Entretanto, a inclusão da regra de Galil resulta em uma execuação linear entre todos os casos.[3][6]
defalphabet_index(c):""" Returns the index of the given character in the English alphabet, counting from 0. """returnord(c.lower())-97# 'a' is ASCII character 97defmatch_length(S,idx1,idx2):""" Returns the length of the match of the substrings of S beginning at idx1 and idx2. """ifidx1==idx2:returnlen(S)-idx1match_count=0whileidx1<len(S)andidx2<len(S)andS[idx1]==S[idx2]:match_count+=1idx1+=1idx2+=1returnmatch_countdeffundamental_preprocess(S):""" Returns Z, the Fundamental Preprocessing of S. Z[i] is the length of the substring beginning at i which is also a prefix of S. This pre-processing is done in O(n) time, where n is the length of S. """iflen(S)==0:# Handles case of empty stringreturn[]iflen(S)==1:# Handles case of single-character stringreturn[1]z=[0forxinS]z[0]=len(S)z[1]=match_length(S,0,1)foriinrange(2,1+z[1]):# Optimization from exercise 1-5z[i]=z[1]-i+1# Defines lower and upper limits of z-boxl=0r=0foriinrange(2+z[1],len(S)):ifi<=r:# i falls within existing z-boxk=i-lb=z[k]a=r-i+1ifb<a:# b ends within existing z-boxz[i]=belse:# b ends at or after the end of the z-box, we need to do an explicit match to the right of the z-boxz[i]=b+match_length(S,a,r+1)l=ir=i+z[i]-1else:# i does not reside within existing z-boxz[i]=match_length(S,0,i)ifz[i]>0:l=ir=i+z[i]-1returnzdefbad_character_table(S):""" Generates R for S, which is an array indexed by the position of some character c in the English alphabet. At that index in R is an array of length |S|+1, specifying for each index i in S (plus the index after S) the next location of character c encountered when traversing S from right to left starting at i. This is used for a constant-time lookup for the bad character rule in the Boyer-Moore string search algorithm, although it has a much larger size than non-constant-time solutions. """iflen(S)==0:return[[]forainrange(26)]R=[[-1]forainrange(26)]alpha=[-1forainrange(26)]fori,cinenumerate(S):alpha[alphabet_index(c)]=iforj,ainenumerate(alpha):R[j].append(a)returnRdefgood_suffix_table(S):""" Generates L for S, an array used in the implementation of the strong good suffix rule. L[i] = k, the largest position in S such that S[i:] (the suffix of S starting at i) matches a suffix of S[:k] (a substring in S ending at k). Used in Boyer-Moore, L gives an amount to shift P relative to T such that no instances of P in T are skipped and a suffix of P[:L[i]] matches the substring of T matched by a suffix of P in the previous match attempt. Specifically, if the mismatch took place at position i-1 in P, the shift magnitude is given by the equation len(P) - L[i]. In the case that L[i] = -1, the full shift table is used. Since only proper suffixes matter, L[0] = -1. """L=[-1forcinS]N=fundamental_preprocess(S[::-1])# S[::-1] reverses SN.reverse()forjinrange(0,len(S)-1):i=len(S)-N[j]ifi!=len(S):L[i]=jreturnLdeffull_shift_table(S):""" Generates F for S, an array used in a special case of the good suffix rule in the Boyer-Moore string search algorithm. F[i] is the length of the longest suffix of S[i:] that is also a prefix of S. In the cases it is used, the shift magnitude of the pattern P relative to the text T is len(P) - F[i] for a mismatch occurring at i-1. """F=[0forcinS]Z=fundamental_preprocess(S)longest=0fori,zvinenumerate(reversed(Z)):longest=max(zv,longest)ifzv==i+1elselongestF[-i-1]=longestreturnFdefstring_search(P,T):""" Implementation of the Boyer-Moore string search algorithm. This finds all occurrences of P in T, and incorporates numerous ways of pre-processing the pattern to determine the optimal amount to shift the string and skip comparisons. In practice it runs in O(m) (and even sublinear) time, where m is the length of T. This implementation performs a case-insensitive search on ASCII alphabetic characters, spaces not included. """iflen(P)==0orlen(T)==0orlen(T)<len(P):return[]matches=[]# PreprocessingR=bad_character_table(P)L=good_suffix_table(P)F=full_shift_table(P)k=len(P)-1# Represents alignment of end of P relative to Tprevious_k=-1# Represents alignment in previous phase (Galil's rule)whilek<len(T):i=len(P)-1# Character to compare in Ph=k# Character to compare in Twhilei>=0andh>previous_kandP[i]==T[h]:# Matches starting from end of Pi-=1h-=1ifi==-1orh==previous_k:# Match has been found (Galil's rule)matches.append(k-len(P)+1)k+=len(P)-F[1]iflen(P)>1else1else:# No match, shift by max of bad character and good suffix ruleschar_shift=i-R[alphabet_index(T[h])][i]ifi+1==len(P):# Mismatch happened on first attemptsuffix_shift=1elifL[i+1]==-1:# Matched suffix does not appear anywhere in Psuffix_shift=len(P)-F[i+1]else:# Matched suffix appears in Psuffix_shift=len(P)-L[i+1]shift=max(char_shift,suffix_shift)previous_k=kifshift>=i+1elseprevious_k# Galil's rulek+=shiftreturnmatches
[C implementation]
#include<stdint.h>#include<stdlib.h>#define ALPHABET_LEN 256#define NOT_FOUND patlen#define max(a, b) ((a < b) ? b : a)// delta1 table: delta1[c] contains the distance between the last// character of pat and the rightmost occurrence of c in pat.// If c does not occur in pat, then delta1[c] = patlen.// If c is at string[i] and c != pat[patlen-1], we can// safely shift i over by delta1[c], which is the minimum distance// needed to shift pat forward to get string[i] lined up// with some character in pat.// this algorithm runs in alphabet_len+patlen time.voidmake_delta1(int*delta1,uint8_t*pat,int32_tpatlen){inti;for(i=0;i<ALPHABET_LEN;i++){delta1[i]=NOT_FOUND;}for(i=0;i<patlen-1;i++){delta1[pat[i]]=patlen-1-i;}}// true if the suffix of word starting from word[pos] is a prefix// of wordintis_prefix(uint8_t*word,intwordlen,intpos){inti;intsuffixlen=wordlen-pos;// could also use the strncmp() library function herefor(i=0;i<suffixlen;i++){if(word[i]!=word[pos+i]){return0;}}return1;}// length of the longest suffix of word ending on word[pos].// suffix_length("dddbcabc", 8, 4) = 2intsuffix_length(uint8_t*word,intwordlen,intpos){inti;// increment suffix length i to the first mismatch or beginning// of the wordfor(i=0;(word[pos-i]==word[wordlen-1-i])&&(i<pos);i++);returni;}// delta2 table: given a mismatch at pat[pos], we want to align// with the next possible full match could be based on what we// know about pat[pos+1] to pat[patlen-1].//// In case 1:// pat[pos+1] to pat[patlen-1] does not occur elsewhere in pat,// the next plausible match starts at or after the mismatch.// If, within the substring pat[pos+1 .. patlen-1], lies a prefix// of pat, the next plausible match is here (if there are multiple// prefixes in the substring, pick the longest). Otherwise, the// next plausible match starts past the character aligned with// pat[patlen-1].//// In case 2:// pat[pos+1] to pat[patlen-1] does occur elsewhere in pat. The// mismatch tells us that we are not looking at the end of a match.// We may, however, be looking at the middle of a match.//// The first loop, which takes care of case 1, is analogous to// the KMP table, adapted for a 'backwards' scan order with the// additional restriction that the substrings it considers as// potential prefixes are all suffixes. In the worst case scenario// pat consists of the same letter repeated, so every suffix is// a prefix. This loop alone is not sufficient, however:// Suppose that pat is "ABYXCDBYX", and text is ".....ABYXCDEYX".// We will match X, Y, and find B != E. There is no prefix of pat// in the suffix "YX", so the first loop tells us to skip forward// by 9 characters.// Although superficially similar to the KMP table, the KMP table// relies on information about the beginning of the partial match// that the BM algorithm does not have.//// The second loop addresses case 2. Since suffix_length may not be// unique, we want to take the minimum value, which will tell us// how far away the closest potential match is.voidmake_delta2(int*delta2,uint8_t*pat,int32_tpatlen){intp;intlast_prefix_index=patlen-1;// first loopfor(p=patlen-1;p>=0;p--){if(is_prefix(pat,patlen,p+1)){last_prefix_index=p+1;}delta2[p]=last_prefix_index+(patlen-1-p);}// second loopfor(p=0;p<patlen-1;p++){intslen=suffix_length(pat,patlen,p);if(pat[p-slen]!=pat[patlen-1-slen]){delta2[patlen-1-slen]=patlen-1-p+slen;}}}uint8_t*boyer_moore(uint8_t*string,uint32_tstringlen,uint8_t*pat,uint32_tpatlen){inti;intdelta1[ALPHABET_LEN];int*delta2=(int*)malloc(patlen*sizeof(int));make_delta1(delta1,pat,patlen);make_delta2(delta2,pat,patlen);// The empty pattern must be considered speciallyif(patlen==0)returnstring;i=patlen-1;while(i<stringlen){intj=patlen-1;while(j>=0&&(string[i]==pat[j])){--i;--j;}if(j<0){free(delta2);return(string+i+1);}i+=max(delta1[string[i]],delta2[j]);}free(delta2);returnNULL;}
[Java implementation]
/** * Returns the index within this string of the first occurrence of the * specified substring. If it is not a substring, return -1. * * @param haystack The string to be scanned * @param needle The target string to search * @return The start index of the substring */publicstaticintindexOf(char[]haystack,char[]needle){if(needle.length==0){return0;}intcharTable[]=makeCharTable(needle);intoffsetTable[]=makeOffsetTable(needle);for(inti=needle.length-1,j;i<haystack.length;){for(j=needle.length-1;needle[j]==haystack[i];--i,--j){if(j==0){returni;}}// i += needle.length - j; // For naive methodi+=Math.max(offsetTable[needle.length-1-j],charTable[haystack[i]]);}return-1;}/** * Makes the jump table based on the mismatched character information. */privatestaticint[]makeCharTable(char[]needle){finalintALPHABET_SIZE=256;int[]table=newint[ALPHABET_SIZE];for(inti=0;i<table.length;++i){table[i]=needle.length;}for(inti=0;i<needle.length-1;++i){table[needle[i]]=needle.length-1-i;}returntable;}/** * Makes the jump table based on the scan offset which mismatch occurs. */privatestaticint[]makeOffsetTable(char[]needle){int[]table=newint[needle.length];intlastPrefixPosition=needle.length;for(inti=needle.length-1;i>=0;--i){if(isPrefix(needle,i+1)){lastPrefixPosition=i+1;}table[needle.length-1-i]=lastPrefixPosition-i+needle.length-1;}for(inti=0;i<needle.length-1;++i){intslen=suffixLength(needle,i);table[slen]=needle.length-1-i+slen;}returntable;}/** * Is needle[p:end] a prefix of needle? */privatestaticbooleanisPrefix(char[]needle,intp){for(inti=p,j=0;i<needle.length;++i,++j){if(needle[i]!=needle[j]){returnfalse;}}returntrue;}/** * Returns the maximum length of the substring ends at p and is a suffix. */privatestaticintsuffixLength(char[]needle,intp){intlen=0;for(inti=p,j=needle.length-1;i>=0&&needle[i]==needle[j];--i,--j){len+=1;}returnlen;}
Variantes
O algoritmo BMH (Boyer-Moore-Horspool) é uma simplificação do algoritmo BM usando apenas a regra do caractere errado.
O algoritmo AG (Apostolico-Giancarlo) aumenta o precesso de checagem quando uma combinação ocorre no dado alinhamento pulando comparações explicitas de caracteres. Isso usa informação recolhida durante o pré-processamento do padrão em conjunção com os tamanhos das combinações de sufixo gravadas em cada tentativa de combinar. Guardar os tamanhos das combinações dos sufixos requer uma tabela adicional igual em tamanho com o texto sendo pesquisado.
↑ ab
Gusfield, Dan (1999) [1997], «Chapter 2 - Exact Matching: Classical Comparison-Based Methods», Algorithms on Strings, Trees, and Sequences, ISBN0521585198 1 ed. , Cambridge University Press, pp. 19–21
Koordinat: 8°38′20″S 115°08′43″E / 8.638897°S 115.145314°E / -8.638897; 115.145314 CangguDesaNegara IndonesiaProvinsiBaliKabupatenBadungKecamatanKuta UtaraKode pos80361Kode Kemendagri51.03.06.2005 Kode BPS51.03.06.2005Luas5,23 km²[1]Jumlah penduduk5.375 jiwa (2016)[1] 7.088 jiwa (2010)[2]Kepadatan1.355 jiwa/km² (2010)Jumlah RW1 Banjar[1]Jumlah KK1.320[1] Canggu adalah desa di kecamatan Kuta Utara, Kabupaten Bad...
Halaman ini berisi artikel tentang waralaba media permainan video. Untuk kegunaan lain, lihat Five Nights at Freddy's (disambiguasi).Five Nights at Freddy'sAliranHoror (genre)Pengembang Scott Cawthon Steel Wool Studios Illumix Penerbit Scott Cawthon Clickteam Illumix PembuatScott CawthonPenyusun lagu Leon Riskin Allen Simpson Pelantar Microsoft Windows PlayStation 4 PlayStation 5 Xbox One Xbox Series X/S Nintendo Switch iOS Android Oculus Quest Oculus Quest 2 Google Stadia Terbitan pertamaFiv...
Adhie Massardi[1] merupakan mantan juru bicara Presiden KH Abdurrahman Wahid ini dikenal tak henti mengkritik keras pemerintahan Presiden Susilo Bambang Yudhoyono dan Joko Widodo. Segala bentuk kritik itu, ia tuangkan dalam bentuk tulisan dan puisi. Demi memperjuangkan idealismenya, wartawan senior ini merapat ke barisan ekonom Rizal Ramli sebagai aktivis Komite Bangkit Indonesia dan Gerakan Indonesia Bersih. Rujukan ^ Tokoh Indonesia Diarsipkan 2014-11-29 di Wayback Machine.: Adhie M...
Electrical resistance attributed to contacting interfaces Electrical contact resistance (ECR, or simply contact resistance) is resistance to the flow of electric current caused by incomplete contact of the surfaces through which the current is flowing, and by films or oxide layers on the contacting surfaces. It occurs at electrical connections such as switches, connectors, breakers, contacts, and measurement probes. Contact resistance values are typically small (in the microohm to milliohm ra...
This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Demographics of the Netherlands – news · newspapers · books · scholar · JSTOR (November 2011) (Learn how and when to remove this template message) Demographics of the NetherlandsPopulation pyramid of the Netherlands in 2023Population17,821,419 (January 2023) (...
Common name for a lizard without obvious legs The slowworm, a legless lizardLegless lizard may refer to any of several groups of lizards that have independently lost limbs or reduced them to the point of being of no use in locomotion.[1] It is the common name for the family Pygopodidae.[2] These lizards are often distinguishable from snakes on the basis of one or more of the following characteristics: possessing eyelids, possessing external ear openings, lack of broad belly sc...
Yvonne Brathwaite Burke Yvonne Brathwaite Burke (lahir 5 Oktober 1932) adalah seorang politikus dan pengacara Amerika Serikat dari California.[1][2] Ia adalah wanita Afrika-Amerika pertama yang mewakili Pesisir Barat dalam Kongres. Ia menjabat dalam Kongres AS dari 1973 sampai Januari 1979. Suaminya adalah William Burke, seorang filontropis berpengaruh dan penyelenggara Maraton Los Angeles.[3] Referensi ^ BURKE, Yvonne Brathwaite | US House of Representatives: History,...
Карта рельефа Украины Низменности Украины Около 70% равнинной части составляют низменности[1]. К ним принадлежит: Полесская низменность, занимает крайнюю северо-западную часть страны это сильно заболоченная равнинная территория с широкими водоразделами и речными до...
Danish handball player (born 1982) Anders Eggert Eggert in 2016Personal informationFull name Anders Eggert JensenAnders Eggert MagnussenBorn (1982-05-14) 14 May 1982 (age 41)Aarhus, DenmarkNationality DanishHeight 1.79 m (5 ft 10 in)Playing position Left wingSenior clubsYears Team0000–1998 Brabrand1998–1999 Voel1999–2000 Brabrand2000–2003 Silkeborg/Voel KFUM2003–2006 GOG2006–2017 SG Flensburg-Handewitt2008–2009 → Skjern Håndbold (loan)2017–2021 Skjern H�...
Keuskupan San MiniatoDioecesis Sancti MiniatiKatolik Katedral San MiniatoLokasiNegaraItaliaProvinsi gerejawiFirenzeStatistikLuas691 km2 (267 sq mi)Populasi- Total- Katolik(per 2010)170.142158,000 (92.9%)Paroki91InformasiDenominasiGereja KatolikRitusRitus RomaPendirian5 Desember 1622 (401 tahun lalu)KatedralCattedrale di Ss. Maria Assunta e GenesioKepemimpinan kiniPausFransiskusUskupAndrea Migliavacca[1][2]PetaSitus webwww.sanminiato.chiesacat...
The Magic HourJapanese posterSutradaraKōki MitaniDitulis olehKōki MitaniDistributorTohoTanggal rilis 07 Juni 2008 (2008-06-07) NegaraJapanPendapatankotor$36,023,586[1] The Magic Hour (ザ・マジックアワーcode: ja is deprecated ) adalah film Jepang produksi tahun 2008 bergenre komedi yang ditulis dan disutradarai oleh Kōki Mitani. Film yang dirilis pada 7 Juni 2008, ini dibintangi oleh Kōichi Satō sebagai Taiki Murata, Satoshi Tsumabuki sebagai Noboru Bingo, Toshiyuki ...
Este artículo o sección necesita referencias que aparezcan en una publicación acreditada. Busca fuentes: «Dolby Surround» – noticias · libros · académico · imágenesEste aviso fue puesto el 13 de marzo de 2013. Dolby Surround es la contraparte para codificación de la decodificación Dolby Pro Logic, pero las primeras implementaciones caseras del decodificador Dolby Surround fueron llamadas Dolby Surround lo cual dio lugar a confusión. Los decodificadores Dolby...
American singer (born 1979) Neyo redirects here. For other uses, see Neyo (disambiguation). Ne-YoNe-Yo in 2022BornShaffer Chimere Smith (1979-10-18) October 18, 1979 (age 44)[1]Camden, Arkansas, U.S.Other namesGogoEducationLas Vegas AcademyOccupations Singer songwriter actor dancer record producer Years active1998–presentWorks Discography production Spouse Crystal Renay Williams (m. 2016; div. 2023)PartnerMonyetta Sh...
Centro histórico de San Petersburgo y conjuntos monumentales anexos Patrimonio de la Humanidad de la Unesco Vista del corps de logis desde la cour d'honneur. Palacio de AlejandroLocalizaciónPaís RusiaCoordenadas 59°43′16″N 30°23′34″E / 59.721111111111, 30.392777777778Datos generalesTipo CulturalCriterios i, ii, iv, viIdentificación 540Región Europa y América del NorteInscripción 1990 (XIV sesión) Sitio web oficial [editar datos en Wikidata] El...
Nyai Ratu Kamala Sari[1]Njahi Ratoe Koemala SarieLitografi kompleks keraton Banjar di Martapura pada tahun 1843Berkuasa1825-1 November 1857KelahiranKoemala Sarie1766Amuntai Kesultanan BanjarKematian1 November 1857[2][3]Martapura, BanjarPemakamanKampung Jawa, Kota MartapuraWangsaDinasti Banua LimaAyahKiai Adipati SingasariIbuAluh ArijahPasangan1. Sultan Sulaiman 2. Sultan Adam Anak1. ♂ Pangeran Ratoe/Sulthan Moeda Abdoe Rachman (wafat 1852), anak dengan Sultan Adam ...
This stake is one of several way markers that mark the location of variously calculated geographic centres of Britain.[citation needed] It is located just to the west of Whitendale Hanging Stones in Lancashire at SD 64188 56541. Centrographers at the centre of mainland Great Britain, in a field near Whalley, Lancashire at Grid Ref SD 72321.72 36671.1 (approximately), in December 2005 There has long been debate over the exact location of the geographical centre of the United Kingdom, ...
8e régiment de chevau-légers lanciers Un cavalier polonais du 8e régiment. Création 18 juillet 1811 Dissolution 1815 Pays France Allégeance Empire français Branche Grande Armée Type Régiment Rôle Cavalerie Effectif 43 officiers 1 000 Garnison Sedan Guerres Guerres napoléoniennes Batailles Bataille de la Bérézina Bataille de CzaśnikiBataille de Bautzen (1813)Bataille de Kulm Commandant Thomas Lubienski modifier Le 8e régiment de chevau-légers lanciers ...
Opposition to the conventional social, political, and economic principles of a society This article is about social and political opposition to the Establishment. For religious freedom, see Anti-Establishment Clause. For the British punk band, see Anti-Establishment (band). Antiestablishmentarian redirects here. Not to be confused with Antidisestablishmentarianism. Part of the Politics seriesParty politics Political Spectrum Left-Wing Far-LeftCentre-Left Centre Centre-LeftRadical CentreCentre...
Colombian neuroscientist (born 1934) In this Spanish name, the first or paternal surname is Llinás and the second or maternal family name is Riascos. Rodolfo LlinásRodolfo Llinás RiascosBorn (1934-12-16) 16 December 1934 (age 89)Bogotá, ColombiaNationalityColombian and AmericanAlma materPontificia Universidad Javeriana and Australian National UniversityKnown forPhysiology of the cerebellum, the thalamus, Thalamocortical dysrhythmia as well as for his pioneering work...