Кіріспе
Деректер құрылымының түрі – байттық деңгейдегі құрылым. Компьютер ғылымында массив – бұл әрқайсысы кем дегенде бір массив индексімен немесе кілтімен анықталатын, бірдей жад көлеміне ие элементтердің (мәндер немесе айнымалылар) жиынтығынан тұратын дерек құрылымы. Массив әр элементтің орнын математикалық формула арқылы оның индекс тобынан есептеу үшін сақталады. Дерек құрылымының ең қарапайым түрі – сызықтық массив, ол бір өлшемді массив деп те аталады. Мысалы, он 32 биттік (4 байттық) бүтін сандық айнымалыдан тұратын массив, 0-ден 9-ға дейінгі индекстермен, он сөз ретінде жад адрестерінде сақталуы мүмкін: 2000, 2004, 2008, …, 2036 (он алтылық санауда: 0x7D0, 0x7D4, 0x7D8, …, 0x7F4), яғни i индексі бар элемент 2000 + (i × 4) адресінде орналасқан. Массивтің бірінші элементінің жад адресі – бірінші адрес, бастапқы адрес немесе негізгі адрес деп аталады. Матрицаның математикалық түсінігі екі өлшемді тор ретінде бейнеленгендіктен, екі өлшемді массивтерді кейде «матрицалар» деп те атайды. Кейбір жағдайларда «вектор» термині массивді білдіру үшін қолданылады, бірақ векторларға қарағанда, түплдер математикалық тұрғыдан дұрыс балама болып табылады. Кестелер көбінесе массивтар түрінде, әсіресе іздеу кестелері ретінде жүзеге асырылады; «кесте» сөзі кейде массивтің синонимі ретінде қолданылады. Массивтер – ең көне және маңызды дерек құрылымдарының бірі, оларды дерлік барлық бағдарламалар қолданады. Олар сондай-ақ тізімдер мен жолдар сияқты көптеген басқа дерек құрылымдарын іске асыру үшін қолданылады. Олар компьютерлердің адрестеу логикасын тиімді пайдаланады. Көптеген қазіргі заманғы компьютерлерде және сыртқы жад құрылғыларында жад – бір өлшемді сөздер массиві, олардың индекстері олардың адрестері болып табылады. Процессорлар, әсіресе векторлық процессорлар, массивтік операциялар үшін жиі оңтайландырылады. Массивтер негізінен пайдалы, өйткені элементтердің индекстерін орындалу кезінде есептеуге болады. Басқа нәрселермен қатар, бұл мүмкіндік бір итеративті оператордың массивтің кез келген санындағы элементтерін өңдеуіне мүмкіндік береді. Сондықтан массив дерек құрылымының элементтері бірдей өлшемде болуы керек және бірдей деректерді көрсетуі керек. Жарамды индекс тобы және элементтердің адрестері (осылайша элементтің адрестеу формуласы) әдетте, бірақ әрқашан емес, массивті индекстеу бастапқыда өзін-өзі өзгертетін кодпен, ал кейінірек индекстік тіркеулер мен жанама адрестеу арқылы жасалды. 1960 жылдары жасалған кейбір мейнфреймдер, мысалы, Burroughs B5000 және оның ұрпақтары, аппараттық құралдарда индекс шектерін тексеру үшін жад сегментациясын қолданды. Ассемблер тілдерінде, әдетте, массивтер үшін арнайы қолдау жоқ, тек машинаның өзі қамтамасыз етеді. Ең алғашқы жоғары деңгейдегі бағдарламалау тілдері, соның ішінде FORTRAN (1957), Lisp (1958), COBOL (1960) және ALGOL 60 (1960), көп өлшемді массивтерді қолдады, сондай-ақ C (1972) тілі де. C++ (1983) тілінде орындалу уақытында өлшемі белгіленген көп өлшемді массивлер үшін кластық үлгілер бар. 1 (бірге негізделген индекстеу) Массивтің бірінші элементі 1 нөмірімен индекстеледі. n (n-ге негізделген индекстеу) Массивтің базалық индексі еркін таңдалуы мүмкін. Әдетте n-ге негізделген индекстеуге рұқсат беретін бағдарламалау тілдері теріс индекстік мәндерге және басқа да скалярлық деректер түрлеріне, мысалы, санамаларға рұқсат береді немесе таңбалар массив индексі ретінде қолданылуы мүмкін. Нөлге негізделген индекстеуді көптеген ықпалды бағдарламалау тілдері, соның ішінде C, Java және Lisp таңдады. Бұл массивтің бастапқы орнынан ауытқуды білдіретін субскрипт арқылы оңайрақ іске асыруға мүмкіндік береді, сондықтан бірінші элементтің ауытқуы нөлге тең. Массивтерде бірнеше өлшем болуы мүмкін, сондықтан бірнеше индекстерді пайдалана отырып массивке кіру жиі кездеседі. Мысалы, үш қатары және төрт бағаны бар екі өлшемді массив A, нөлге негізделген индекстеу жүйесінде 2-ші қатардағы және 4-ші бағандағы элементке A[1][3] өрнегі арқылы қол жеткізуді қамтамасыз етеді. Осылайша екі өлшемді массив үшін екі индекс, үш өлшемді массив үшін үш, ал n өлшемді массив үшін n индекс қолданылады. Элементті анықтау үшін қажетті индекстер саны массивтің өлшемділігі, өлшемділігі немесе рангі деп аталады. Стандартты массивтерде әрбір индекс белгілі бір диапазонға жататын бүтін сандармен (немесе санамаланған түрдегі белгілі бір мәндермен) шектеледі, ал элементтің адресі индекстер бойынша «сызықты» формуламен есептеледі.
the byte layout level structure
In computer science, an array is a data structure consisting of a collection of elements (values or variables), of same memory size, each identified by at least one array index or key. An array is stored such that the position of each element can be computed from its index tuple by a mathematical formula. The simplest type of data structure is a linear array, also called one dimensional array. For example, an array of ten 32 bit (4 byte) integer variables, with indices 0 through 9, may be stored as ten words at memory addresses 2000, 2004, 2008, , 2036, (in hexadecimal: 0x7D0, 0x7D4, 0x7D8, , 0x7F4) so that the element with index i has the address 2000 + (i × 4). The memory address of the first element of an array is called first address, foundation address, or base address. Because the mathematical concept of a matrix can be represented as a two dimensional grid, two dimensional arrays are also sometimes called "matrices". In some cases the term "vector" is used in computing to refer to an array, although tuples rather than vectors are the more mathematically correct equivalent. Tables are often implemented in the form of arrays, especially lookup tables; the word "table" is sometimes used as a synonym of array. Arrays are among the oldest and most important data structures, and are used by almost every program. They are also used to implement many other data structures, such as lists and strings. They effectively exploit the addressing logic of computers. In most modern computers and many external storage devices, the memory is a one dimensional array of words, whose indices are their addresses. Processors, especially vector processors, are often optimized for array operations. Arrays are useful mostly because the element indices can be computed at run time. Among other things, this feature allows a single iterative statement to process arbitrarily many elements of an array. For that reason, the elements of an array data structure are required to have the same size and should use the same data representation. The set of valid index tuples and the addresses of the elements (and hence the element addressing formula) are usually, but not always, Array indexing was originally done by self modifying code, and later using index registers and indirect addressing. Some mainframes designed in the 1960s, such as the Burroughs B5000 and its successors, used memory segmentation to perform index bounds checking in hardware. Assembly languages generally have no special support for arrays, other than what the machine itself provides. The earliest high level programming languages, including FORTRAN (1957), Lisp (1958), COBOL (1960), and ALGOL 60 (1960), had support for multi dimensional arrays, and so has C (1972). In C++ (1983), class templates exist for multi dimensional arrays whose dimension is fixed at runtime
1 (one based indexing) The first element of the array is indexed by subscript of 1.
n (n based indexing) The base index of an array can be freely chosen. Usually programming languages allowing n based indexing also allow negative index values and other scalar data types like enumerations, or characters may be used as an array index. Using zero based indexing is the design choice of many influential programming languages, including C, Java and Lisp. This leads to simpler implementation where the subscript refers to an offset from the starting position of an array, so the first element has an offset of zero. Arrays can have multiple dimensions, thus it is not uncommon to access an array using multiple indices. For example, a two dimensional array A with three rows and four columns might provide access to the element at the 2nd row and 4th column by the expression A[1][3] in the case of a zero based indexing system. Thus two indices are used for a two dimensional array, three for a three dimensional array, and n for an n dimensional array. The number of indices needed to specify an element is called the dimension, dimensionality, or rank of the array. In standard arrays, each index is restricted to a certain range of consecutive integers (or consecutive values of some enumerated type), and the address of an element is computed by a "linear" formula on the indices.
Бір өлшемді массивтер
Бір өлшемді массив (немесе бір өлшемді массив) – сызықтық массивтің бір түрі. Оның элементтеріне қол жеткізу үшін бір ғана индекс қолданылады, ол қатар немесе баған индексін көрсете алады. Мысал ретінде, C тіліндегі `int anArrayName[10];` жарияланымды қарастырайық, ол он бүтін санды сақтайтын бір өлшемді массивті анықтайды. Бұл массивте `int` типіндегі он элемент сақталады. Массивтің индекстері нөлден тоғызға дейін болады. Мысалы, `anArrayName[0]` және `anArrayName[9]` өрнектері сәйкесінше бірінші және соңғы элементтерді көрсетеді. Сызықтық адрестеуі бар вектор үшін, `i` индексіндегі элемент `B + c · i` мекенжайында орналасқан, мұнда `B` – тұрақты базалық мекенжай, ал `c` – тұрақты көбейтілгіш, кейде адрестік қадам деп те аталады. Егер жарамды элементтердің индексі 0-ден басталса, `B` тұрақтысы массивтің бірінші элементінің мекенжайын көрсетеді. Осы себепті, C бағдарламалау тілінде массивтердің индексі әрқашан 0-ден басталады деп белгіленген; көптеген бағдарламашылар бұл элементті "бірінші" емес, "нөлдік" деп атайды. Дегенмен, бірінші элементтің индексін базалық мекенжай `B` дұрыс таңдалса өзгертуге болады. Мысалы, егер массивте 1-ден 5-ке дейін индекстелген бес элемент болса және базалық мекенжай `B`, `B + 30c` арқылы алмастырылса, онда сол элементтердің индекстері 31-ден 35-ке дейін болады. Егер нөмірлеу 0-ден басталмаса, `B` тұрақтысы массивтегі кез келген элементтің мекенжайын көрсетпеуі мүмкін.
Дроп векторлары
Адрестік формула d өлшеммен, B негізгі мекенжаймен және c1, c2, …, ck арттыру шамаларымен толық анықталады. Бұл параметрлерді массивтің сипаттамасы немесе қадамдық вектор немесе доп вектор деп аталатын жазбаға біріктіру жиі пайдалы. Өсуге қабілетті массивтер кез келген орынға элементтерді қосу немесе жою үшін сызықтық (Θ(n)) уақытты қажет етеді. Тізбекті тізімдер ортадағы элементтерді тұрақты уақытта жоюға және қосуға мүмкіндік береді, бірақ индекстелген қол жеткізу үшін сызықтық уақыт қажет. Олардың жадты пайдалануы массивтерге қарағанда нашар, бірақ әлі де сызықтық. Илиф векторы – көп өлшемді массив құрылымына балама. Ол бір өлшемді массивтің кішірек өлшемді массивтерге сілтемелерін пайдаланады. Атап айтқанда, екі өлшем үшін бұл баламалы құрылым – әр қатар үшін векторларға сілтемелердің векторы болады (c немесе c++ сілтемесі). Осылайша, A массивінің i-ші қатары мен j-ші бағанындағы элементке екі рет индекстеу арқылы қол жеткізіледі (әдеттегі белгілеу бойынша A[i][j]). Бұл баламалы құрылым әр қатардың әртүрлі өлшемде болуына мүмкіндік беретін қисық массивтерді құруға болады, яғни әр индекстің жарамды диапазоны барлық алдыңғы индекстердің мәндеріне байланысты. Сонымен қатар, бұл құрылым бір көбейтуді (баған мекенжайымен көбейту) бір биттік ығыстырумен (қатарлық сілтемелер векторының индексі) және бір қосымша жадқа қол жеткізумен (қатар мекенжайын алу) алмастырады, бұл кейбір архитектураларда тиімді болуы мүмкін.
Өлшем
Массивтің өлшемдері – элементті таңдау үшін қажетті индекстер саны. Егер массив мүмкін индекстер комбинациялары жиынтығындағы функция ретінде қарастырылса, онда ол оның доменінің дискретті ішкі жиыны болып табылатын кеңістіктің өлшемдерін көрсетеді. Сондықтан бір өлшемді массив – деректер тізімі, екі өлшемді массив – деректер тіктөртбұрышы, үш өлшемді массив – деректер блогы болып табылады, және т.б. Бұл, белгілі бір домені бар матрицалар жиынының өлшемдерімен, яғни массивтегі элементтер санымен шатастырылмауы керек. Мысалы, 5 қатарлы және 4 бағанды массив екі өлшемді, бірақ мұндай матрицалар 20 өлшемді кеңістік құрайды. Сол сияқты, үш өлшемді вектор үштік өлшемді массив арқылы бейнеленуі мүмкін.