cpp conas comparáid a dhéanamh le léarscáileanna


freagra 1:

Go matamaiticiúil, is samhail é Léarscáil a thógann eochair agus a fhreagraíonn le luach. Is cás speisialaithe de Léarscáil é Sraith ina bhfuil an eochair comhionann leis an luach a mhapálann sé. Baineann an coincheap seo le cur i bhfeidhm C ++ an dá réad seo.

Cathain a bhíonn std :: léarscáil úsáideach: Smaoinigh ar bhunachar sonraí a stórálann cuntais úsáideora, abair gur cuntais netflix iad. Féadfaidh an léarscáil a léiríonn an tábla seo d’úsáideoirí netflix ID úsáideora a fháil agus an réad úsáideora atá ábhartha don uimhir aitheantais sin a thabhairt ar ais. Ansin is féidir linn an ID a úsáid chun an cuntas úsáideora a aisghabháil in am O (1) tríd an ID úsáideora uathúil a ghreamú den chuntas, agus chun cuntas a chuardach ní gá duit ach an ID d’fhonn na sonraí úsáideora seo go léir a aisghabháil.

An féidir linn é sin a dhéanamh le std :: set? Conas a d’fhéadfaimis an sampla roimhe seo a chur i bhfeidhm le tacar? Is féidir linn cuntais úsáideora a chur isteach inár tacar std :: ach nuair is mian linn cuntas úsáideora a chuardach beidh an cuntas úsáideora iomlán ag teastáil uainn chun cuardach a dhéanamh ar ár dtaifead úsáideora. Fan nóiméad, má tá an t-eolas cuntas úsáideora againn cheana, cén fáth go mbeadh orainn cuardach a dhéanamh air? Chomh maith leis sin, mura bhfuil againn ach an uimhir aitheantais úsáideora, ní féidir linn an cuntas a aisghabháil a thuilleadh in am O (1), ní mór dúinn an tábla iomlán a athrá chun an cuntas a mheaitseálann a fháil agus is é seo O (N).

Cathain a d’fhéadfadh gur mhaith leat std :: map vs. a úsáid nuair a d’fhéadfadh gur mhaith leat std :: map a úsáid le haghaidh primitive? Smaoinigh ar struchtúr atá beartaithe chun na príomhuimhreacha go léir a stóráil faoi luach treallach áirithe N. Más mian linn a fháil amach an bhfuil uimhir ina ball den tsraith prámaí ansin tá ciall le std :: set, b’fhéidir gur mhaith linn a sheiceáil an bhfuil slánuimhir treallach ann tá luach ‘k’ inár tacar agus d’fhéadfadh nach mbeimis ar an eolas faoi aon smaoineamh ar innéacs nó ar eochair. Mar sin féin, má tá suim againn i seicheamh na dtréimhsí ansin b’fhéidir go dteastaíonn péireáil príomhluacha uainn. B’fhéidir gur mhaith linn an seicheamh p = {2, 3, 5, 7, 11,…} a shamhaltú agus ba mhaith linn a fháil amach an bhfuil p [j] = k do roinnt luachanna treallach j & k. Sa chás deireanach seo b’fhéidir gur mhaith linn smaoineamh ar std :: map (cé go bhféadfadh std :: veicteoir a bheith ina rogha maith freisin).

Mar sin i mbeagán focal:

  1. Is éard atá i struchtúr sonraí socraithe cineál speisialaithe de struchtúr sonraí léarscáile ina léiríonn eochair == luach, agus na sainmhínithe C ++ STL an coincheap seo
  2. std :: map than std :: set i gcoitinne níos úsáidí ós rud é go soláthraíonn std :: map cuardach tapa de réir eochair ar luachanna comhiomlána (réada iomlána seachas primitive).
  3. std :: is minic a bhíonn tacar níos úsáidí do phríomhaigh ós rud é go bhfuil mapáil luach primitive k-> k sách treallach

freagra 2:

Tá ag teip ar go leor de na freagraí teagmháil a dhéanamh leis an athrú ar chur i bhfeidhm na léarscáileanna agus coimeádáin a leagan síos do C ++ 17, fiú nuair is ábhartha, mar sin clúdóidh mé é sin go heisiach.

Conas is féidir leat nód a bhogadh ó choimeádán amháin go coimeádán eile?

Conas is féidir leat eochair nód léarscáile a athrú?

Má chuir tú sonraí sochorraithe ach nach bhfuil in-chóipeáilte i léarscáil nó i tacar, conas is féidir leat iad a fháil ar ais arís?

Freagraítear iad seo go léir i C ++ 17 trí struchtúr sonraí teimhneach nua a chur leis… láimhseáil an nód… agus dhá fheidhm ball nua do gach tacar nó coimeádán léarscáile a oibríonn le láimhseálacha nód… sliocht, a bhaintear nód as léarscáil nó suite i láimhseáil nód, agus ró-ualach nua de chur isteach, a thógann nód ó láimhseáil nód agus a chuireann isteach i léarscáil nó i tacar é. Tá modh nua áise ann freisin, cumasc, a ghluaiseann gach nóid neamh-dhúblach i léarscáil amháin nó a leagtar isteach i gceann eile.

Láimhseáil nód (C ++ 17)

Tá airíonna iomadúla ag láimhseáil nód. Tá nód eastósctha aige ar an gcaoi chéanna a dhéanann std :: uathúil_ptr agus mar sin tá sé sochorraithe ach níl sé in-chóipeáilte. Má tá nód ag láimhseáil nód nuair a dhéantar é a scriosadh, déantar an nód a dhíothú agus a thuiscint ... rud a chiallaíonn go gcaithfidh sé cóip den leithdháilteoir a úsáid ina choimeádán chun tuiscint a fháil. Ciallaíonn sé seo go gcaithfidh na leithdháilteoirí a úsáidtear in dhá choimeádán comparáid a dhéanamh idir tuairisceáin chomhionanna (oibreoir == fíor) chun nód a bhogadh ó choimeádán amháin go dtí an ceann eile. Déanann gach leithdháilteoir réamhshocraithe comparáid chothrom, mar sin de ghnáth ní fadhb í seo.

Cé gur le nód láimhseáil nód é nód, is féidir oibriú air ar bhealaí nach féidir a dhéanamh agus é laistigh de mhapa nó de thacar. Mar shampla, féadfar a eochair léarscáil eastósctha a athrú trí sannadh do nh.key () agus luach mapáilte neamh-inphriontáilte a bhogadh amach ag baint úsáide as std :: move (nh.mapped ()). Is féidir luach neamh-inphriontáilte a bhaint as nód socraithe eastósctha ag baint úsáide as std :: move (nh.value ()).


freagra 3:

Faoi láthair, cuireann C ++ 8 gcaighdeán ar fáil

coimeádáin chomhcheangailte

sa spás seo:

  • std :: tacar
  • std :: multiset
  • std :: unordered_set
  • std :: unordered_multiset
  • std :: léarscáil
  • std :: multimap
  • std :: unordered_map
  • std :: unordered_multimap

D’fhéadfá a thabhairt faoi deara go bhfuil 3 aiseanna athraithe anseo:

  • socraigh vs léarscáil.
  • ordaíodh vs neamhordúil.
  • eochair uathúil vs eochair il.

D'iarr tú faoi tacar vs léarscáil; áfach, is fiú fios a bheith agat conas piocadh i measc na 8 teaglaim go léir.

socraigh vs léarscáil

Tá tacar eochracha ag tacar. Is féidir leat eochracha a chur isteach agus a bhaint den tacar, tástáil an bhfuil an eochair i láthair sa tacar, agus aithris a dhéanamh ar thacar na n-eochracha go léir. Nuair a chuirtear eochair isteach sa tacar, tá an eochair dochorraithe. Ní féidir leat eochair a athrú nuair a chuirtear isteach í. Ina ionad sin, ní mór duit í a scriosadh agus an eochair nua a chur isteach más mian leat eochair atá ann cheana a athrú.

Ceanglaíonn léarscáil luach le gach eochair. Is féidir le luachanna a bheith ina gcineál ar leith ón eochair féin. De ghnáth, bíonn luachanna inathraithe freisin. Is féidir liom luach a chuardach de réir a eochair, agus an luach a athrú nuair a fhaighim é.

Ba mhaith leat tacar a úsáid nuair nach bhfuil imní ort ach faoin tacar eochracha atá agat. Ba mhaith leat léarscáil a úsáid nuair a bhíonn imní ort bunachar luachanna a bhfuil eochracha bainteach leo a rianú.

Mar shampla, is dócha go raibh mé ag iarraidh súil a choinneáil ar na daoine go léir a bhí ag freastal ar chruinniú. D’fhéadfadh go mbeadh tacar leordhóthanach chuige sin. Tá gach freastalaí ina bhall den tacar, agus is féidir liom gach ball den tacar a aithris chun liosta de lucht freastail a ghiniúint.

Cuir i gcás go ndéantar freastal ar mo chruinniú, agus ba mhaith liom roghanna béile na ndaoine go léir a fhreastalaíonn ar mo chruinniú a rianú. Anois ba mhaith liom léarscáil freastail de rogha na béile. Is í an eochair sa chás seo an freastalaí, agus is é an luach an rogha béile. Féadfaidh tú roghanna béile gach freastalaí a mhodhnú gan an freastalaí féin a mhodhnú. (Níl sé chomh seafóideach sin ...)

ordaíodh vs neamhordúil

Na coimeádáin chomhcheangailte gan

neamhordúil

san tairiscint ainm

O (\ lg n)

am rochtana. Teastaíonn eochracha uathu atá

Inchomparáideach

agus

Ordaíodh Lag docht.

De ghnáth tógtar iad as crainn chuardaigh dénártha chothromaithe. Má athraíonn tú na heilimintí go léir, tabharfaidh tú cuairt ar na heochracha in ord nach bhfuil ag laghdú. (Nó ordú nach bhfuil ag méadú, má úsáideann tú iteoirí droim ar ais.)

Tairgeann na coimeádáin chomhcheangailte nach bhfuil aon ainm ordaithe orthu ainm rochtana amúchta O (1), ar an gcoinníoll gur féidir leat feidhm hashing O (1) a thógáil do d’eochair. Ar bhonn collaí, tugtar táblaí hash orthu seo. Teastaíonn feidhm hashing éifeachtach uait chun go n-oibreoidh na coimeádáin neamhordáilte go héifeachtúil. Má athraíonn tú na heilimintí go léir, tabharfaidh tú cuairt ar na heochracha in ord treallach.

Cathain ar chóir duit ordú vs neamhordáilte a úsáid? Braitheann sé ar chúpla rud:

  • An gá duit cuairt a thabhairt ar na heochracha go léir in ord cinntitheach go minic? Más ea, b’fhéidir gur rogha réasúnta é coimeádán ordaithe.
  • An bhfuil an chomparáid níos gasta nó níos moille ná an hashing? Má tá sé i bhfad níos gasta, b’fhéidir go mbeadh ordú níos fearr. Má tá sé i bhfad níos moille, d’fhéadfadh go mbeadh neamhord níos tapa.
  • An bhfuil a fhios agat thart ar mhéid iomlán an choimeádáin roimh ré? D’fhéadfadh sé go mbeadh sé costasach coimeádán neamh-ordaithe a athrú, ach ní gnách go mbíonn luascáin feidhmíochta fiáine ann má chuirtear isteach i gcoimeádán ordaithe é.
  • Cén lorg cuimhne is féidir leat a fhulaingt? Is gnách go mbíonn coimeádáin neamhordáilte ag trádáil méid ar luas.

Má scríobhann tú do chód go cúramach, is féidir leat triail a bhaint as aistriú idir coimeádáin ordaithe agus neamhordáilte go tagarmharc a fheidhmíonn níos fearr do d’ualach oibre áirithe.

Cuireadh deireadh le hiarratas amháin a scríobh mé le meascán suimiúil de choimeádáin ordaithe agus neamhordáilte bunaithe ar a leithéid de thagarmharcáil. Chuir sé iontas beag orm cé na coimeádáin a bhuaigh cá háit, agus conas a d’athraigh sé sin nuair a d’athraigh mé airíonna na n-eochracha. Go háirithe, nuair a aistríodh ó std :: sreang go tábla sreanga arna innéacsú ag slánuimhreacha, tháinig athrú suntasach ar chostas na bhfeidhmeanna hashing.

eochair uathúil vs il-eochair

Ní cheadaíonn na coimeádáin chomhcheangailte nach bhfuil ainm iolrach orthu ach sampla amháin de gach eochair sa choimeádán. Is é sin, caithfidh gach eochair a bheith uathúil. Soláthraíonn sé seo séimeantaic cosúil le sraith 1T, áit a bhfuil gné amháin ag gach innéacs. Earráid loighciúil is ea eochair atá ann cheana sa choimeádán a chur isteach.

Ligeann na coimeádáin chomhcheangailte a bhfuil il in ainm orthu iliomad cásanna de gach eochair. Is féidir leat gach eochair a chur isteach a mhéad uair is mian leat. Coinnítear na heochracha arís agus arís eile in ord isteach.

Nóta: Tá sé seo tábhachtach fiú amháin i gcás multiset toisc go ndéanann na critéir chomórtais idirdhealú comhionann le comhionann. Tá dhá eochracha coibhéiseach mura ndéanann ceachtar acu comparáid níos lú ná an ceann eile; áfach, ní cheanglaítear ar an bhfeidhm chomórtais réimsí uile an phríomhchuspóra a chur san áireamh.

Cén ceann ba chóir duit a roghnú? Braitheann sé go mór ar an bhfadhb atá tú ag iarraidh a réiteach. De réir an scéil, is annamh a bhí gá agam le multisets nó multimaps.

Más gá duit súil a choinneáil ar na cásanna go léir de ‘eochair’ a fheiceann tú, cibé acu atá nó nach bhfuil cuid acu i gcomparáid lena chéile, ansin is é multiset nó multimap an rogha cheart. Seachas sin, is dócha go dteastaíonn uait na tacair nó na mapaí neamh-il.

Úsáid spéisiúil amháin le haghaidh std :: multiset nó std :: multimap is ea scuaine tosaíochta. Úsáid an tosaíocht mar eochair. Is í an eilimint a chuirtear ar ais trí thús () an mhír is mó tosaíochta atá agat. Coinnítear liosta na n-earraí in ord sórtáilte, mar sin má thugtar athrá a dhíríonn ar earra, is féidir leat a chinneadh go tapa cad atá díreach roimhe agus díreach ina dhiaidh. Go háirithe, má dhéantar tosaíocht a léiriú in am - is é sin, scuaine imeachta le hordú ama atá sa scuaine tosaíochta seo - ansin is féidir leat a chinneadh go saor cad iad na himeachtaí atá sceidealta gar do thréimhse áirithe.

Ní oibríonn sé seo ach leis an multiset ordaithe agus multimap ordaithe, áfach.

std :: tosaíocht_queue

b’fhéidir gur rogha níos fearr é mura dteastaíonn uait ach rochtain thapa ar an mír is mó tosaíochta agus mura mbainfeá leas as nádúr lán-sórtáilte multiset nó multimap. (Féach

std :: tosaíocht_queue

le haghaidh tuilleadh sonraí.)


freagra 4:

Bhuel is féidir liom é sin a fhreagairt.

Léarscáileanna

Teastaíonn eochracha ó léarscáileanna. I gcás gach eochair, tá luach (í) de chineál áirithe agat.

Anois, is féidir eochair a bheith mar rud ar bith, slánuimhir, sreangán nó fiú réad (ar fáil le feidhmiúlacht chomórtais bhreise). Mar sin is féidir na luachanna a bheith ann.

Féach ar seo:

léarscáil M; // eochair slánuimhir - luach slánuimhirM [3] = 2;léarscáil S; // eochair teaghrán - luach slánuimhirS ["ahar"] = 26;

Tá sé seo suimiúil.

Cuir i gcás gur mhaith leat breithlaethanta do chairde a stóráil. Ní dhearbhaíonn tú ach léarscáil agus a n-ainmneacha agus a ndátaí breithe a stóráil ach trí thasc simplí a dhéanamh. Tá sé cosúil le foclóir i Python.

Tacair

Ní hamhlaidh atá i gcás tacair. Ní gá péireáil (eochair, luach) a thabhairt do sheiteanna. Níl iontu ach cibé cineál luachanna (ar ndóigh le feidhmeanna comparáide nó ró-ualú oibreora nuair is gá) a theastaíonn uait iad a bheith ann. Mar shampla:

leagtha S;S.insert (13);leagtha T;S.insert ("ahar");leagtha X;S.insert (yourObject);

Ó thaobh na feidhmíochta de, tá cosúlachtaí eatarthu. Tá cuardach, cuir isteach, scriosadh srl. In ord

O (logn)

sa bheirt acu (buíochas le

Crann Dearg Dubh

, an rud a raibh eagla ort roimhe i do chúrsa Struchtúr Sonraí: P). Ach mar gheall ar na difríochtaí cur chun feidhme agus úsáide, is féidir forchostais áirithe a bheith ann.

Nóta Breise:

Má dhéanann tú breathnóireacht, gheobhaidh tú amach go bhfuil tacair agus léarscáileanna difriúil ón bpeirspictíocht struchtúrtha bunúsach. Mar sin is féidir leis an gceist a chuir tú a bheith rud beag níos suimiúla má smaoiníonn tú air ar bhealach inar féidir leat tacair a úsáid mar mhalairt ar léarscáileanna agus a mhalairt.

Féadann sé seo ceist spéisiúil a chur orainn: cad é an difríocht idir tacar > agus léarscáil ? Is ceist an-bhailí í seo mar sa chás seo, is féidir leat smaoineamh ar an gcéad eilimint den phéire sa tacar atá coibhéiseach leis an eochair ar an léarscáil!

Mar shampla:

léarscáil M;M.insert ({"motta", 13});leagtha > S;S.insert ({"motta", 13});

Feiceann tú gur féidir an tacar atá scríofa thuas a bheith ina mhalartach ionchasach ar an léarscáil.

An ionann iad mar sin? Bhuel, níl.

Ar dtús, ní féidir slánuimhir dhifriúil a bheith ar an léarscáil don eochair chéanna agus a dhearbhaíomar thuas. Ach is féidir tacar.

Mar sin,

M.insert ({"ahar", 13)};S.insert ({"ahar", 13});M.insert ({"ahar", 26});S.insert ({"ahar", 26});

is ionann méid an tacair agus 2 ach 1 ar an léarscáil.

Ar an dara dul síos, ba chóir go mbeadh a fhios agat cheana féin go n-úsáideann na coimeádáin C ++ seo iteoirí a úsáidtear chun eilimintí sna coimeádáin seo a chur in iúl. Chun smaoineamh air go simplí, is éard atá in iteoirí ná na rudaí a theastaíonn uait a rochtain chun na sonraí sna coimeádáin seo a rochtain.

Anois féach ar seo:

leagtha > S;S.insert ({"ahar", 26});uathoibríoch é = S.begin (); // is iteoir anois é do ("ahar", 26)

Ar chúis éigin, tá sé ar intinn agat luach na beirte comhfhreagraí a athraíonn sé a athrú ó 26 go 13. Baineann tú triail as seo:

é-> dara = 13;

Umm… nah. Ní féidir leat é sin a dhéanamh.

Tá an chúis casta go leor. Níl ort ach a chur, tá na iteoirí le haghaidh tacar C ++ cosúil le iteoirí seasmhach. Mar sin ní féidir leat an luach comhfhreagrach sonraí atá i bhfeidhm a mhodhnú. Ní mór duit é a scriosadh ón tacar agus ansin do luach nua a chur leis, mar seo:

S.erase (é);péire p = {"ahar", 13};S.insert (p);

: |

I gcás léarscáileanna, tá sé seo bailí go hiomlán:

léarscáil M;M.insert ({"motta", 13});uathoibríoch é = M.begin ();é-> dara = 26;

Tá súil agam go bhfuil gach rud ceart agam. : P.

Go raibh maith agat as léamh.


freagra 5:

Is éard atá i léarscáil struchtúr sonraí a úsáidtear chun luachanna le heochracha a chuardach, cé nach bhfuil i tacar ach bailiúchán luachanna.

Maidir le cur chun feidhme, de ghnáth ní chuirtear i bhfeidhm iad ar bhealach difriúil agus is gnách go n-úsáideann an dá chrann Crann Dearg-Dubh faoin gcochall chun castacht ama logartamach a fháil d’fhormhór na n-oibríochtaí. Difríocht amháin, ag brath ar chur chun feidhme, is ea gur crann eilimintí dearg-dubh a bheadh ​​i tacar agus go mbeadh léarscáil ina chrann dearg-dubh d’eilimintí tuple (eochair, luach) curtha in eagar de réir na chéad eiliminte (an eochair) sa tuple.


freagra 6:

Léarscáilíonn léarscáil réad amháin go ceann eile. Is éard atá i tacar tacar rudaí ordaithe. Is minic a úsáidtear léarscáil chun rochtain a fháil ar rudaí le hinnéacs sa chaoi is go bhfuil an réad le hinnéacs i réadMap [i]. Is féidir tacar a úsáid chun rudaí a stóráil, agus an sochar breise ann go sainaithníonn tacar an bhfuil réad ann cheana agus nach stórálann sé ach aonán amháin de na rudaí. Mar sin féin, ní féidir leat rochtain a fháil ar rudaí i dtacar ach trí atarlú a dhéanamh air nó an chéad eilimint nó an ghné dheireanach den tacar a fháil.


freagra 7:

Is sraith chomhcheangailte, ordaithe é std :: map. Ciallaíonn sé sin go stórálann sé péirí agus de réir na heochrach, b’fhéidir go bhfaighidh tú an luach. Chomh maith leis sin, is féidir leat aithris a dhéanamh ar an leanfaidh péirí agus an t-atreorú dea-ord na n-eochracha.

Is bailiúchán luachanna é std :: set, amháin. Arís is féidir leat athrá a dhéanamh air agus arís leanfaidh an t-atriall ord maith ar na luachanna. Ach níl aon chomhlachas mar atá thuas, ní fhéadfaidh tú ach ceisteanna mar “an bhfuil an luach seo sa tacar?” Agus chuige sin, caithfidh an luach atá i gceist a bheith agat cheana féin.