Algoritma sorusu

Kodla Büyü

kaeii

Seçkin Üye
Seçkin Üye
Mesajlar
770
arkadaşlar bu soru hakkında fikir verebilir misiniz ?

* y kişi 1 farklı bilgiye sahip
*kişiler bu bilgiyi mail ile birbirine iletecek.
* her gönderilecek mailin sadece 1 alıcısı olacak.
*1 kişi o zamana dek okuduğu bütün bilgileri oluşturduğu bir mail'e yazıyor
* y kişinin bütün mailleri okuduğu garanti edileceği ve bunu minimum mail göndererek yapılmasını sağlayan algoritma tasarımı.

Ben şu şekilde düşündüm
1. kim bütün e postaları okudu ?(fonksiyon 1)
* hangi veri yapısı doğru olur açıkçası çözemediğim kısım bu.

2. bütün e postaları okuyan diğerlerine mail atsın(fonksıyon2)
 
arkadaşlar bu soru hakkında fikir verebilir misiniz ?

* y kişi 1 farklı bilgiye sahip
*kişiler bu bilgiyi mail ile birbirine iletecek.
* her gönderilecek mailin sadece 1 alıcısı olacak.
*1 kişi o zamana dek okuduğu bütün bilgileri oluşturduğu bir mail'e yazıyor
* y kişinin bütün mailleri okuduğu garanti edileceği ve bunu minimum mail göndererek yapılmasını sağlayan algoritma tasarımı.

Ben şu şekilde düşündüm
1. kim bütün e postaları okudu ?(fonksiyon 1)
* hangi veri yapısı doğru olur açıkçası çözemediğim kısım bu.

2. bütün e postaları okuyan diğerlerine mail atsın(fonksıyon2)
Graf ile rahat modellenir sanki hocam. E-posta alan ile gönderen arasında kenar oluşturursunuz. Matrisı kontrol ettiğinizde bütün düğümler ile kenarı olan düğümler bütün e-postaları almıştır. Doğru anladıysam eğer hafızada komşuluk matrisi ile modellenmiş Graf işinizi görür.

Örneğin; resimdeki graf ve komşuluk matrisini ele alalım. 2 numaralı kişi için matris dolaşıldığında 0 ve 1 numaralı kişilerden e-posta aldığı tespit edilmiş olur.

GzU4BKw.png


Edit: Daha iyi anlaşılsın diye örnek graf eklendi.
 
Son düzenleme:
Graf ile rahat modellenir sanki hocam. E-posta alan ile gönderen arasında kenar oluşturursunuz. Matrisı kontrol ettiğinizde bütün düğümler ile kenarı olan düğümler bütün e-postaları almıştır. Doğru anladıysam eğer hafızada komşuluk matrisi ile modellenmiş Graf işinizi görür.

Örneğin; resimdeki graf ve komşuluk matrisini ele alalım. 2 numaralı kişi için matris dolaşıldığında 0 ve 1 numaralı kişilerden e-posta aldığı tespit edilmiş olur.

GzU4BKw.png


Edit: Daha iyi anlaşılsın diye örnek graf eklendi.
Hocam teşekkür ederim öncelikle emeğiniz için. Yönlendirilmiş graf üzerinden çözüm üretmişssiniz. Peki şu şekilde nasıl olurdu ? bir ağaç üzerinden verileri kontrol ettirsek yani bir kişiyi pivot olarak seçeceğiz (root) eğer diğer kişilerden root a mail gelmiş ise aradığımız kişi odur değilse swap işlemiyle diğer kullanıcıya geç gibi.
 
Son düzenleme:
Sorunun orjinalini gorebilirsem bir yorum yapabilirim.

y adet kişi 1 tane farklı bilgiye sahiptir. bu kişiler elindeki bilgiyi diğer kullanıcılar ile paylaşacaktır.
bir kişi mail atarken de sadece bir kişiyi alıcı olarak şeçiyor.
y kişi içerisinden bir kişi okuduğu bütün bilgileri kendi oluşturduğu bir e posta da topluyor.
y kişinin bütün mailleri okuduğu garanti edileceği ve bunu minimum mail göndererek yapılmasını sağlayan algoritma tasarımı.
soru bu.

burda ilk kontrol edilecek şey y kişi içinden hangisinde tüm mailler var zaten bu sorunun temelini oluşturuyor.
@zulfikar1985 hocam da bir fikir verdi. İlginiz için teşekkür ederim.
 
bir kişi mail atarken de sadece bir kişiyi alıcı olarak şeçiyor.
Bu bilgiden dolayi bu soru LinkedList veri yapisina sahip. Graph'ta bir node'a birden fazla node baglanabiliyor. LinkedList'te her node sadece bir tane node'u adresliyor. Y adet node'u tek tek dolasinca algoritma karmasikligi O(n) oluyor. Ki bu da bu problem icin mumkun olan en iyi sonuc.

Elemanlari tek tek dolasip iletecegi bir mesaj varsa iletebilir, herhangi birinde bir bilgi varsa okuyabilir. Son elemana geldiginde herkesin mailleri okudugundan emin olur.

Ayrica nedense "y kisinin her birinin birer bilgi tasidigi" gibi bir anlam cikarmaya yonlendiriyor soru. Herkes bir onceki kisiden bir mail aliyor ve aldigi maili okuduguna dair kendi adini da alta ekleyip sonrakine gonderiyor sanki. Bu sekilde soru daha mantikli geliyor. Ama muglak ifadeler var sorunun yazim seklinde. Kolay gelsin. İyi calismalar.
 
Bu bilgiden dolayi bu soru LinkedList veri yapisina sahip. Graph'ta bir node'a birden fazla node baglanabiliyor. LinkedList'te her node sadece bir tane node'u adresliyor. Y adet node'u tek tek dolasinca algoritma karmasikligi O(n) oluyor. Ki bu da bu problem icin mumkun olan en iyi sonuc.

Elemanlari tek tek dolasip iletecegi bir mesaj varsa iletebilir, herhangi birinde bir bilgi varsa okuyabilir. Son elemana geldiginde herkesin mailleri okudugundan emin olur.

Ayrica nedense "y kisinin her birinin birer bilgi tasidigi" gibi bir anlam cikarmaya yonlendiriyor soru. Herkes bir onceki kisiden bir mail aliyor ve aldigi maili okuduguna dair kendi adini da alta ekleyip sonrakine gonderiyor sanki. Bu sekilde soru daha mantikli geliyor. Ama muglak ifadeler var sorunun yazim seklinde. Kolay gelsin. İyi calismalar.
teşekkür ederim.
 
İşinize yaramıştır umarım.
ben ilk mesaja bağlı oalrak şöyle düşündüm: tüm bilgileri bilen kişinin olması için diğer kişiler 1 e posta yollamalı. ve herkesin tüm verileri okuması içinde pivot kişinin herkese 1 posta yollaması gerekli.(n-1) Yöntem olaraksa bir komşuluk matrısı oluşturup (yönlü graf)aranan durumu bulduğumda [1-1-1...n durumu] n-1 kere mail Gönder fonksiyonunu n-1 kez çağırmak. sizin tercih ettiğiniz linked list de aslında güzel bir çözüm. ona da bakacağım
 
y adet kişi 1 tane farklı bilgiye sahiptir. bu kişiler elindeki bilgiyi diğer kullanıcılar ile paylaşacaktır.
bir kişi mail atarken de sadece bir kişiyi alıcı olarak şeçiyor.
y kişi içerisinden bir kişi okuduğu bütün bilgileri kendi oluşturduğu bir e posta da topluyor.
y kişinin bütün mailleri okuduğu garanti edileceği ve bunu minimum mail göndererek yapılmasını sağlayan algoritma tasarımı.
soru bu.

burda ilk kontrol edilecek şey y kişi içinden hangisinde tüm mailler var zaten bu sorunun temelini oluşturuyor.
@zulfikar1985 hocam da bir fikir verdi. İlginiz için teşekkür ederim.

Hocam burada y adet kisi birer adet bilgiye sahiptir demiyor. Soru duzgun yazilmamis derken bunu kastediyordum. Ama yine de farketmiyor.

Tum maillere sahip olan kisi de spesifik olarak belirtilmemis. LinkedList'in sonundaki eleman bunun icin secilebilir. Her elemanin elinde farkli bir bilgi oldugunu varsayarsak, Root eleman elindeki bilgiyi bir sonrakine aktarir. Sonraki gelen bilgiye kendi bilgisini de ekler bir sonraki elemana aktarir vs... Bu sekilde LinkedList'in sonundaki elemana gelindiginde bastaki de dahil herkesin bilgisi eklenmis olur.

Yani 10 kisiyiz diyelim, herkes bir oncekinin elindeki bilgiyi attach ederek ekledigi maili alir, kendi de elindeki bilgiyi attach ederek sonrakine forward eder. Bu sekilde en sondaki eleman tum bilgiye sahip olur.

N kisinin hepsinin elinde birer sayi olsun, sonuncu kisi tum sayilarin toplamina sahip olsun gibi bir soru bu. LinkedList de kullanilabilir, array de kullanilabilir. Ancak LinkedList bunun icin daha efektif olur. Her eleman sadece bir kisiye mail gonderebildigi icin graph buna uygun degil diye dusunuyorum.
 
Hocam burada y adet kisi birer adet bilgiye sahiptir demiyor. Soru duzgun yazilmamis derken bunu kastediyordum. Ama yine de farketmiyor.

Tum maillere sahip olan kisi de spesifik olarak belirtilmemis. LinkedList'in sonundaki eleman bunun icin secilebilir. Her elemanin elinde farkli bir bilgi oldugunu varsayarsak, Root eleman elindeki bilgiyi bir sonrakine aktarir. Sonraki gelen bilgiye kendi bilgisini de ekler bir sonraki elemana aktarir vs... Bu sekilde LinkedList'in sonundaki elemana gelindiginde bastaki de dahil herkesin bilgisi eklenmis olur.

Yani 10 kisiyiz diyelim, herkes bir oncekinin elindeki bilgiyi attach ederek ekledigi maili alir, kendi de elindeki bilgiyi attach ederek sonrakine forward eder. Bu sekilde en sondaki eleman tum bilgiye sahip olur.

N kisinin hepsinin elinde birer sayi olsun, sonuncu kisi tum sayilarin toplamina sahip olsun gibi bir soru bu. LinkedList de kullanilabilir, array de kullanilabilir. Ancak LinkedList bunun icin daha efektif olur. Her eleman sadece bir kisiye mail gonderebildigi icin graph buna uygun degil diye dusunuyorum.
Sizin de ifade ettiğiniz gibi soru çok muğlak hocam. Eğer dediğiniz gibi bir şey istenmişse bağlı listede her bir eleman için kullanılacak pointerları düşününce bana dizi çok daha uygun geldi. Siz neden bağlı liste efektif olur diye düşündünüz hocam?
 
Sizin de ifade ettiğiniz gibi soru çok muğlak hocam. Eğer dediğiniz gibi bir şey istenmişse bağlı listede her bir eleman için kullanılacak pointerları düşününce bana dizi çok daha uygun geldi. Siz neden bağlı liste efektif olur diye düşündünüz hocam?
Çok yönlü graf değil mi hocam kullandığınız?
 
Sizin de ifade ettiğiniz gibi soru çok muğlak hocam. Eğer dediğiniz gibi bir şey istenmişse bağlı listede her bir eleman için kullanılacak pointerları düşününce bana dizi çok daha uygun geldi. Siz neden bağlı liste efektif olur diye düşündünüz hocam?

Hocam soruda her eleman sadece bir kişiye mail gönderebilir dediği için, her elemanın sadece sonrakinin adresini biliyor olması gerekiyor gibi bir anlam çıkıyor. Yani soruyu soran "kardeşim bunu LinkedList kullanarak çözün, veri modelinizi buna göre oluşturun" demek istemiş sanki. Yoksa daha önce dediğim gibi array de olur.

Neden array değil de LinkedList? Elemanları teker teker dolaşma konusunda LinkedList daha hızlı. Pointer dolayısıyla ram'de kapasite açısından bir miktar dezavantajlı olsa da, dinamik ram kullanımı ve ram'deki adreslemenin ardışık olması dolayısıyla hız açısından avantajlı.

Şu da var ki, eğer tüm elemanların herkesin elindeki bilgiye ulaşması gerekiyorsa, LinkedList'de bir tur daha dolaşılması gerekir. Çünkü tek tur atılınca her eleman sadece kendinden öncekilerin elindeki bilgiye sahip oluyor. 2. Eleman 3. Elemanın elindeki bilgiyi bilmiyor. Sadece 0. ve 1. Elemanın gönderdiğini biliyor.

İki tur atılacaksa Circled LinkedList de kullanılabilir. Farketmez. 2. turda y-1. elemana da ulaşılınca herkes her bilgiye sahip olmuş olur. Bu senaryoda da algoritma karmaşıklığı O(2n-1) oluyor ki halen çok verimli demek.(Sabitler atılır O(2n) olarak kabul edilir.)
 
Hocam burada y adet kisi birer adet bilgiye sahiptir demiyor. Soru duzgun yazilmamis derken bunu kastediyordum. Ama yine de farketmiyor.

Tum maillere sahip olan kisi de spesifik olarak belirtilmemis. LinkedList'in sonundaki eleman bunun icin secilebilir. Her elemanin elinde farkli bir bilgi oldugunu varsayarsak, Root eleman elindeki bilgiyi bir sonrakine aktarir. Sonraki gelen bilgiye kendi bilgisini de ekler bir sonraki elemana aktarir vs... Bu sekilde LinkedList'in sonundaki elemana gelindiginde bastaki de dahil herkesin bilgisi eklenmis olur.

Yani 10 kisiyiz diyelim, herkes bir oncekinin elindeki bilgiyi attach ederek ekledigi maili alir, kendi de elindeki bilgiyi attach ederek sonrakine forward eder. Bu sekilde en sondaki eleman tum bilgiye sahip olur.

N kisinin hepsinin elinde birer sayi olsun, sonuncu kisi tum sayilarin toplamina sahip olsun gibi bir soru bu. LinkedList de kullanilabilir, array de kullanilabilir. Ancak LinkedList bunun icin daha efektif olur. Her eleman sadece bir kisiye mail gonderebildigi icin graph buna uygun degil diye dusunuyorum.
Screenshot_1.png

linked list de data bir veri tutacak ve tuttugu verı gelen maıllerın durumu olacak aranan->(11111) durumu. bu sekılde mı dusundunuz hocam ?
 
There are people in a community and this different person knows a different gossip. It
People want to share the rumors they know with each other via e-mail. One
He told a voicemail e-mail all the rumors he had learned until then, and that an e-mail
Suppose you can only have one recipient.
Guarantees everyone in the community to learn about the gossip and the minimum numbers of it
Design an algorithm to have it done by sending e-mail. For modeling
Describe the data structure you will use and how you use it.
 
Ekli dosyayı görüntüle 69760
linked list de data bir veri tutacak ve tuttugu verı gelen maıllerın durumu olacak aranan->(11111) durumu. bu sekılde mı dusundunuz hocam ?
Evet hocam. Her elemanın elinde bir mail bilgisi var ve sonrakinin mail adresi var. Kendisine kendinden oncekilerin hepsinin bilgisinin eklendigi bir mail geliyor. Gelen maile kendi elindeki bilgiyi de ekleyip sonraki kisiye gonderiyor.
 
There are people in a community and this different person knows a different gossip. It
People want to share the rumors they know with each other via e-mail. One
He told a voicemail e-mail all the rumors he had learned until then, and that an e-mail
Suppose you can only have one recipient.
Guarantees everyone in the community to learn about the gossip and the minimum numbers of it
Design an algorithm to have it done by sending e-mail. For modeling
Describe the data structure you will use and how you use it.
Hocam sizden ricam bir daha bu tur bir soru sordugunuzda iste bu sekilde orjinalini, hatta siteyse sitenin linkini, dijital kitapsa ekran goruntusunu, basili kitapsa fotosunu ekleyerek sormaniz. Siz yorumlayarak yazdiginiz icin sizin yorumunuzu da izaha muhtac kaliyoruz.
 
Hocam sizden ricam bir daha bu tur bir soru sordugunuzda iste bu sekilde orjinalini, hatta siteyse sitenin linkini, dijital kitapsa ekran goruntusunu, basili kitapsa fotosunu ekleyerek sormaniz. Siz yorumlayarak yazdiginiz icin sizin yorumunuzu da izaha muhtac kaliyoruz.
sorunun aslını bılmıyordum ben bana verılmıs halını sızle paylastım. ıngılzıce halını bir arkadasım bulmus ordan aldım. yoksa neden yorum halını atayım
 
Neden array değil de LinkedList? Elemanları teker teker dolaşma konusunda LinkedList daha hızlı. Pointer dolayısıyla ram'de kapasite açısından bir miktar dezavantajlı olsa da, dinamik ram kullanımı ve ram'deki adreslemenin ardışık olması dolayısıyla hız açısından avantajlı.
Bu kısma katılmıyorum hocam. Tam tersine dizi için bellekte ardışık bellek ayrılır. Bağlantılı listede ise(mutlaka daha önce kendiniz kodlamışsınızdır) sınıf, struct v.b. veri öbeklerinin adresleri oluşturma esnasında tahsis edildiği için ardışıklık garanti edilemez. Kaldı ki listeleri güçlü kılan noktalardan birisi sizin de belirttiğiniz gibi çalışma zamanında bellek tahsisi ile birlikte gelen dinamik ram kullanımı. Bir diğer deyişle kolay ölçeklenebilirlik. Bir diğer hususta yukarıda arkadaşımızın @Aety arkadaşımızın paylaşımı ile hem sizin yaklaşımınızı hem de sorunun kastettiklerini anlamış oldum. Gezinti tek taraflı olmayacaksa ki öyle gözüküyor. Tek yönlü bağlantılı liste yeterli olmaz, her düğümde 2(onceki, sonraki) işaretçi tutulması gerekir. Velhasılı kanaatimce sizin öneriniz de dinamik bellek kullanımı v.b. ihtiyaç yok ise dizi performans(hız) açısından daha uygun olacaktır.
 
Bir kaç tanım belirteyim önce:
strongly typed: Bazı programlama dilleri, bir değişken tanımladığınız zaman bu değişkenin türünü de muhakkak surette belirtmenizi zorunlu kılar. Java, c, c++, go, rust gibi diller buna örnektir.
dynamicaly typed: Bu dillerde ise değişkenin türünü yorumlayıcı sizin kodlarınıza bakarak tayin eder. Sürekli olarak değişkenin veri türü değişebilir. Bu kolay olsa da hız ve bellek kullanımı açısından performanstan ödün verir.

array; Misalen, stronlgy typed dillerde 100 elemanlı bir tamsayı(integer) dizisi tanımlayıp "bu diziye eleman eklenmez" derseniz bu array olur(her dilde olmasa da, açıklama için uygun olur). Bu sebeple siz bir array tanımladığınızda, bu array(dizi) ne kadar yer kaplayacak, bellidir. Hal böyle olunca da bu tür diziler genellikle(bazen stack dolu olabilir) stack'te saklanır yani çok hızlıdır ve sıralıdır. Sıralıdırdan kasıt, bellekte arka arkaya yer tutar. Sıralı olması da ayrıca hız açısından avantaj sağlar çünkü işlemci dizinin bir sonraki elemanının nerede saklandığını bilir.

Vector: Dizilerden farkı diyelim ki dinamik olması olsun(her dil böyle olmayabilir). Yani diziye program içerisinde sürekli eleman ekleyip çıkaralım. Programlama dillerinde bu tür diziler stack'ta saklanmaz(stack, cache bellek olur çoğunlukla ya da öyledir, tam emin değilim). Şimdi farz edelim ki, bu diziye çok fazla eleman ekleyip çıkarmıyorsanız, hız açısından array kadar olmasa da iyidir. Ancak diziye çok fazla eleman ekleme/çıkarma yaparsanız bellekte çok daha fazla yer kaplamaya başlar. Bellekte bilgiler arttıkça hız sürekli olarak düşer çünkü işlemci bellekteki bir bilgiye ulaşmak için daha fazla dolaşmak zorunda kalır. Bu sebeple büyük boyutlu vektörler performans açısından bir yerden sonra çok kötü sonuçlar verir. Sebebi ise şu; vektörler arka arkaya dizileceği için bu büyük boyutlu diziye uygun yer bulmak için bellek, uzak bölgelerdeki yerlerde uygun yer bulmak zorundadır. İşlemci de her defasında bu bilgileri uzak bölgelerden çekmek zorunda kalacağı için yavaş işlem yapar.

LinkedList: İşte diyelim ki çoook büyük boyutlu ve dinamik diziniz var. Haliyle işlem hızınız düşüyor. Size bu durumda, ard arda olmayan bir dizi lazım olacak. Ancak, eğer işlemci bu bilgileri dağıtık ve kontrolsüz bir şekilde saklarsa bu kez de bu bilgilerin belleğin hangi bölgesinde olduğunu işlem gücü harcayarak bulmak zorunda olduğundan yine performans kaybı yaşar. Bunun her bir dizi elemanı için değişken tanımlamaktan farkı kalmaz. Bunun çözümü de şudur. LinkedList, hem veriyi, hem de kendisinden sonraki verinin nerede olduğu bilgisini tutar. Haliyle, işlemci o sıradaki verinin ne olduğunu ve bir sonraki verinin de nerede tutulduğunu bilir. Hem de bu sayede, bellekte sıralı bir şekilde diziyi saklamayacağınız için, büyük boyutlu dahi olsa bu linked list, buna uygun, belleğin yakın bölgelerinde yer ayırmak zor değil.

Artık programda buna göre yerine göre linkedlist, yerine göre vektör, yerine göre array kullanılabilir.
 
Bu kısma katılmıyorum hocam. Tam tersine dizi için bellekte ardışık bellek ayrılır. Bağlantılı listede ise(mutlaka daha önce kendiniz kodlamışsınızdır) sınıf, struct v.b. veri öbeklerinin adresleri oluşturma esnasında tahsis edildiği için ardışıklık garanti edilemez. Kaldı ki listeleri güçlü kılan noktalardan birisi sizin de belirttiğiniz gibi çalışma zamanında bellek tahsisi ile birlikte gelen dinamik ram kullanımı. Bir diğer deyişle kolay ölçeklenebilirlik. Bir diğer hususta yukarıda arkadaşımızın @Aety arkadaşımızın paylaşımı ile hem sizin yaklaşımınızı hem de sorunun kastettiklerini anlamış oldum. Gezinti tek taraflı olmayacaksa ki öyle gözüküyor. Tek yönlü bağlantılı liste yeterli olmaz, her düğümde 2(onceki, sonraki) işaretçi tutulması gerekir. Velhasılı kanaatimce sizin öneriniz de dinamik bellek kullanımı v.b. ihtiyaç yok ise dizi performans(hız) açısından daha uygun olacaktır.
İlk bahsettiğiniz komsuluk matrısı ile sözde kod hazırlamaya calıstım hocam tesekkurler.
 
Bu kısma katılmıyorum hocam. Tam tersine dizi için bellekte ardışık bellek ayrılır. Bağlantılı listede ise(mutlaka daha önce kendiniz kodlamışsınızdır) sınıf, struct v.b. veri öbeklerinin adresleri oluşturma esnasında tahsis edildiği için ardışıklık garanti edilemez. Kaldı ki listeleri güçlü kılan noktalardan birisi sizin de belirttiğiniz gibi çalışma zamanında bellek tahsisi ile birlikte gelen dinamik ram kullanımı. Bir diğer deyişle kolay ölçeklenebilirlik. Bir diğer hususta yukarıda arkadaşımızın @Aety arkadaşımızın paylaşımı ile hem sizin yaklaşımınızı hem de sorunun kastettiklerini anlamış oldum. Gezinti tek taraflı olmayacaksa ki öyle gözüküyor. Tek yönlü bağlantılı liste yeterli olmaz, her düğümde 2(onceki, sonraki) işaretçi tutulması gerekir. Velhasılı kanaatimce sizin öneriniz de dinamik bellek kullanımı v.b. ihtiyaç yok ise dizi performans(hız) açısından daha uygun olacaktır.

Hocam ardışıklık konusunda yanlış bilgi vermişim. Haklısınız. Düzeltme için teşekkür. Nedense aklımda öyle kalmış. Ama sorunun ısrarla linkedlist kullanımına yönlendirdiğine eminim. Mesela "30 kişilik bir sınıfta sınıf başkanı herkesin mail adresini biliyor ve herkesten bilgiyi kendisine göndermesini istiyor, kendisi de sonra bu bilgiyi herkesle paylaşacak" şeklinde bir kurgu olsaydı, yani dizinin boyutunu ve index numaralarını bir kişinin bildiği bir soru senaryosu olsaydı, array veri modeli olarak daha uygun olurdu. Ama kulaktan kulağa oynar gibi bir bilgi aktarımı söz konusu olduğundan linkedlist kullanın demeye çalışmışlar diye tahmin ediyorum.

Hız/ram kullanımı konusunda array'ın da linkedlist'in de kendine göre avantajları ve dezantajları var. @eribol hocamız detaylıca açıklamış. Duruma göre kullanmak gerekiyor. Eldeki verinin türü/ boyutuna ve veri üzerinde yapılacak işlemlere göre seçim yapmak gerekiyor(mesela veriler üzerinde binary search kullanılacaksa linkedlist uygun olmaz vs.) Bu soru özelinde dizinin boyutu küçükse hız açısından array daha mantıklı olabilir.

Bu tür sorularda amaç belli kavramları öğretmek olduğundan belli bir kurgu ile veriliyor. Yoksa herkes bir kişiye toplu mail göndersin kardeşim ne linkedlisti ne array'ı der çıkardık. Bu yüzden hız açısından dezavantajlı bile olsa soruyu çözecek kişiye linkedlist ile modelleyin demişler. Bu yüzden @kaeii hocamıza da linkedlist ile de mutlaka çözmesini tavsiye ederim.

Şu bilgiyi de şuraya ekleyeyim: https://www.geeksforgeeks.org/linked-list-vs-array/

Herkese katkıları için teşekkür ederim.
 
Hocam ardışıklık konusunda yanlış bilgi vermişim. Haklısınız. Düzeltme için teşekkür. Nedense aklımda öyle kalmış. Ama sorunun ısrarla linkedlist kullanımına yönlendirdiğine eminim. Mesela "30 kişilik bir sınıfta sınıf başkanı herkesin mail adresini biliyor ve herkesten bilgiyi kendisine göndermesini istiyor, kendisi de sonra bu bilgiyi herkesle paylaşacak" şeklinde bir kurgu olsaydı, yani dizinin boyutunu ve index numaralarını bir kişinin bildiği bir soru senaryosu olsaydı, array veri modeli olarak daha uygun olurdu. Ama kulaktan kulağa oynar gibi bir bilgi aktarımı söz konusu olduğundan linkedlist kullanın demeye çalışmışlar diye tahmin ediyorum.

Hız/ram kullanımı konusunda array'ın da linkedlist'in de kendine göre avantajları ve dezantajları var. @eribol hocamız detaylıca açıklamış. Duruma göre kullanmak gerekiyor. Eldeki verinin türü/ boyutuna ve veri üzerinde yapılacak işlemlere göre seçim yapmak gerekiyor(mesela veriler üzerinde binary search kullanılacaksa linkedlist uygun olmaz vs.) Bu soru özelinde dizinin boyutu küçükse hız açısından array daha mantıklı olabilir.

Bu tür sorularda amaç belli kavramları öğretmek olduğundan belli bir kurgu ile veriliyor. Yoksa herkes bir kişiye toplu mail göndersin kardeşim ne linkedlisti ne array'ı der çıkardık. Bu yüzden hız açısından dezavantajlı bile olsa soruyu çözecek kişiye linkedlist ile modelleyin demişler. Bu yüzden @kaeii hocamıza da linkedlist ile de mutlaka çözmesini tavsiye ederim.

Şu bilgiyi de şuraya ekleyeyim: https://www.geeksforgeeks.org/linked-list-vs-array/

Herkese katkıları için teşekkür ederim.
Hocam ona gorede bır modelleme gerceklestırdım tekrar tesekkurler ilgilenen arkadaslarımıza
 
Hocam ardışıklık konusunda yanlış bilgi vermişim. Haklısınız. Düzeltme için teşekkür. Nedense aklımda öyle kalmış. Ama sorunun ısrarla linkedlist kullanımına yönlendirdiğine eminim. Mesela "30 kişilik bir sınıfta sınıf başkanı herkesin mail adresini biliyor ve herkesten bilgiyi kendisine göndermesini istiyor, kendisi de sonra bu bilgiyi herkesle paylaşacak" şeklinde bir kurgu olsaydı, yani dizinin boyutunu ve index numaralarını bir kişinin bildiği bir soru senaryosu olsaydı, array veri modeli olarak daha uygun olurdu. Ama kulaktan kulağa oynar gibi bir bilgi aktarımı söz konusu olduğundan linkedlist kullanın demeye çalışmışlar diye tahmin ediyorum.

Hız/ram kullanımı konusunda array'ın da linkedlist'in de kendine göre avantajları ve dezantajları var. @eribol hocamız detaylıca açıklamış. Duruma göre kullanmak gerekiyor. Eldeki verinin türü/ boyutuna ve veri üzerinde yapılacak işlemlere göre seçim yapmak gerekiyor(mesela veriler üzerinde binary search kullanılacaksa linkedlist uygun olmaz vs.) Bu soru özelinde dizinin boyutu küçükse hız açısından array daha mantıklı olabilir.

Bu tür sorularda amaç belli kavramları öğretmek olduğundan belli bir kurgu ile veriliyor. Yoksa herkes bir kişiye toplu mail göndersin kardeşim ne linkedlisti ne array'ı der çıkardık. Bu yüzden hız açısından dezavantajlı bile olsa soruyu çözecek kişiye linkedlist ile modelleyin demişler. Bu yüzden @kaeii hocamıza da linkedlist ile de mutlaka çözmesini tavsiye ederim.

Şu bilgiyi de şuraya ekleyeyim: https://www.geeksforgeeks.org/linked-list-vs-array/

Herkese katkıları için teşekkür ederim.
Değerli hocam, senaryoda kişi sayısı zaten belli y kişi... Yani gruba sonradan katılan kişi yok... Başlangıçta belirli sayıda kişi var.... Dolayısıyla derleme zamanında tanımlamanın sakıncası yok, zaten ben de bu yüzden dizi(hız açısından) daha uygun dedim. @eribol hocamın verdiği bilgilere gelince; yazarken kullandığım kavramlardan da anlaşıldığı üzere veri yapıları ve algoritmalar derslerinde daha çok kullanıldığını düşündüğüm, aynı zamanda kendim mezkur ders kapsamındaki ödevlerde(tek yönlü bağlantılı liste, çift yönlü bağlantılı liste, dairesel liste, bağlı liste ile kuyruk ve yığın yapısı, yine liste kullanarak graf ve avl ağaç, dizi kullanarak graf gerçekleştiriminde) kullandığım için c/c++ ekseninde yazdım. Başka bir dili göz önünde bulundurmadım.
Graf kullanılmalı yahut dizi diye ısrar etmiyorum. Ben soruyu anladığım şekliyle öneri sundum. Nitekim sizin eleştirinizi görünce soruda fark etmediğim yanları gördüm. Kanaatimce burada yapılması gereken farklı çözüm önerilerini sorun üzerinde uygulayıp, kaba kodları(hatta belki de kullanılacak dile göre de yorumlanarak esas kodu) yazıp onlar üzerinde zaman ve bellek karmaşıklarına bakıp yorumlayarak ona göre teslim edilmesidir. @eribol hocamın parmak bastığı ve dikkatimizi çekmek istediği nokta da zannımca buydu.

NOT: Uzun zamandır, keyif aldığım nadir başlıklardan oldu. Konuyu açan arkadaş olmak üzere bilgisini paylaşan herkese teşekkürler.
 
Son düzenleme:
Eğer soruyu yanlış anlamadıysam(bilgiler biriktirilerek gönderilebiliyorsa): dairesel bağlantılı liste ile yapılabilir toplamda 2n-1(ilk turda n, ikinci turda n-1) seferde herkeste tüm bilgilerin olduğu garanti edilir.
 
İlginçtir, konu bir başka yerde de karşıma çıktı. LinkedList vs Vector. Burada da kısaca değindiğimiz şeyler daha bir veri üzerinden açıklanmış. L1, L2, L3 gibi cache belleklerin boyutu da burada büyük bir fark yaratıyor ama tek fark buradan da değil. Allocator denilen, verilerin bellekte nasıl saklanacağını derleyiciye söyleyen yapılar var. Malloc gibi ve alternatifler.

Diyelim ki elimizde 1.01mb'lık bir vector(dizi) var. allocator dediğimiz araçlar, bu verinin nerede saklanacağını program çalışırken tayin edebilir. Cache belleğimiz eğer 1mb ise, muhtemelen bu verimiz heap'te saklanır(ram bellekte yani, cache bellekte değil). Ancak misal, 0,5 mb vector cache bellekte saklanabilir. LinkedList yapsak, linkedlist ayrıca pointer bilgisini de taşıyacağı için bu veri cache bellekte yer bulamayabilir. O yüzden LinkedList neredeyse her zaman heap bellekte saklanır. Zaten heap'te saklanmasına gerek olmayacak kadar küçük bir boyutu var ise linkedlist yine gereksizdir.

Diyelim ki vector boyutumuz 10mb veri saklıyorsa, hâlâ bile(donanıma bağlı olarak) vector daha hızlı olabilir. Çünkü aynı veriyi LinkedList kullanarak saklasak, boyut daha da büyüyecek. Lakin boyut büyüdükçe, bu kez de vector arka arkaya sıralanmak zorunda olduğundan uygun yer bulmak zorlaşacak ve LinkedList öne geçmeyece başlayacak.
 
Geri
Üst